How to a use a template file to theme a form?
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: