How to a use a template file to theme a form? While nodes, comments, blocks and many other things in Drupal are themed using theme template files (like node.tpl.php), forms are a different story. There are no theme template files for forms. How can I get a particular form to use a custom theme template?
It's completely reasonable to want to use a tpl file to display a form. You can use lots of extraneous CSS and #prefix/#suffix properties to achieve similar results, but by using tpl's you don't have to clutter up the separation of your logic and presentation layers and don't have to target ugly CSS selectors like #user-login label. Here's an example in Drupal 7...

mytheme/template.php:

function mytheme_theme($existing, $type, $theme, $path) {
    // Ex 1: the "story" node edit form.
    $items['story_node_form'] = array(
        'render element' =&gt; 'form',
        'template' =&gt; 'node-edit--story',
        'path' =&gt; drupal_get_path('theme', 'mytheme') . '/template/form',
    );

    // Ex 2: a custom form that comes from a custom module's "custom_donate_form()" function.
    $items['custom_donate_form'] = array(
        'render element' =&gt; 'form',
        'template' =&gt; 'donate',
        'path' =&gt; drupal_get_path('theme', 'mytheme') . '/template/form',
    );

    return $items;
}


custom_donate_form(): 

function custom_donate_form($form, &amp;$form_state) {
    $form['first_name'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('First name')),
    );
    $form['last_name'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('Last name')),
    );
    $form['address'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('Address')),
    );
    $form['city'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('City')),
    );
    $form['state'] = array(
        '#type' =&gt; 'select',
        '#options' =&gt; array(
            'default' =&gt; 'State',
            '...' =&gt; '...',
        ),
    );
    $form['zip'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('Zip')),
    );
    $form['email'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('Email')),
    );
    $form['phone'] = array(
        '#type' =&gt; 'textfield',
        '#attributes' =&gt; array('placeholder' =&gt; t('Phone')),
    );
    $form['submit'] = array(
        '#type' =&gt; 'submit',
        '#value' =&gt; 'Submit',
    );

    return $form;
}


mytheme/template/form/donate.tpl.php:

&lt;div class="row"&gt;
    &lt;div class="small-12 medium-12 large-8 columns"&gt;

        &lt;div class="row"&gt;
            &lt;div class="small-12 columns"&gt;
                &lt;h5&gt;Contact Information&lt;/h5&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="row"&gt;
            &lt;div class="small-12 large-6 medium-6 columns"&gt;
                &lt;?php print render($form['first_name']); ?&gt;
            &lt;/div&gt;
            &lt;div class="small-12 large-6 medium-6 columns"&gt;
                &lt;?php print render($form['last_name']); ?&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="row"&gt;
            &lt;div class="small-12 medium-6 large-6 columns"&gt;
                &lt;?php print render($form['address']); ?&gt;
            &lt;/div&gt;

            &lt;div class="small-12 medium-6 large-6 columns"&gt;
                &lt;?php print render($form['city']); ?&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="row"&gt;
            &lt;div class="small-12 medium-3 large-3 columns"&gt;
                &lt;?php print render($form['state']); ?&gt;
            &lt;/div&gt;

            &lt;div class="small-12 medium-3 large-3 columns"&gt;
                &lt;?php print render($form['zip']); ?&gt;
            &lt;/div&gt;

            &lt;div class="medium-6 large-6 columns"&gt;&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="row"&gt;
            &lt;div class="small-12 medium-6 large-6 columns"&gt;
                &lt;?php print render($form['email']); ?&gt;
            &lt;/div&gt;

            &lt;div class="small-12 medium-6 large-6 columns"&gt;
                &lt;?php print render($form['phone']); ?&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="row"&gt;
        &lt;div class="small-12 medium-12 large-8 large-offset-2 columns"&gt;
            &lt;?php print render($form['submit']); ?&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;!-- Render any remaining elements, such as hidden inputs (token, form_id, etc). --&gt;
&lt;?php print drupal_render_children($form); ?&gt;


This is using Foundation, which gives us a form like this: