Let users choose from pre-defined user set options for creating a node
I find using a custom form always seems to be more work then just using the one Drupal provides to add nodes. Even if they are not quite what you want hook_form_alter makes it easy to modify them to suit your needs.

I would create an unpublished node for each of my 'presets'. This way it is easy for an administrator to update the preset values, but normal user won't be able to see them.

Then using hook_form_alter I would add a selectbox to the top of the node add form allowing the users to choose between any of the presets. You could add an #ajax property to the selectbox that rebuilds the whole form.

Again in hook_form_alter if $form_state['values']['yourselectbox'] is not empty then you can load the values from that node and populate the form with them.

As an example (none of this code is tested but I think should be almost right):

function mymodule_form_alter($form, &amp;$form_state, $form_id) {

    $templates = db_query("SELECT nid, title FROM node WHERE type='my_type' AND status=1")-&gt;fetchAllKeyed();
    // TODO: Should maybe add a field to control if this node is a template or not?
    $default_template = 0;

    if(!empty($form_state['values']['templates'])) {
        $default_template = $form_state['values']['templates'];

        $selected_template = node_load($default_template);

        // if your fields have multiple values you will need to loop here
        $form['other_field_1'][LANGUAGE_NONE][0]['#value'] = $selected_template['other_field_1'][LANGUAGE_NONE][0]['#value']
        $form['other_field_2'][LANGUAGE_NONE][0]['#value'] = $selected_template['other_field_2'][LANGUAGE_NONE][0]['#value']

    }

    $form['#prefix'] = '&lt;div id="whole_form_wrapper"&gt;';
    $form['#suffix'] = '&lt;/div&gt;';

    $form['templates'] = array(
        '#type' =&gt; 'select',
        '#title' =&gt; 'Template',
        '#options' =&gt; $templates,
        '#default_value' =&gt; $default_template,
        '#ajax' =&gt; array(
            'callback' =&gt; 'change_template_callback',
            'wrapper' =&gt; 'whole_form_wrapper',
            'event' =&gt; 'change',
        ),
    );

}

function change_template_callback($form, $form_state) {
    return $form;
}


See the examples module - it has loads of good stuff on forms and ajax.