I recently needed to add a form field that had a preset list of dropdown options. The last option was Other and when selected, a new text field would appear to so you could fill in an additional option.

I added an additional CharField to my model to store the data.

refer = models.CharField(max_length=255, null=True, blank=True)

then added an additional form field to forms.py

other = forms.CharField(required=False, label='Other')

I updated the form template. I'm using django bootstrap to help style my forms.

<h3>How Did You Find Us?</h3>
<div class="form-group"><
	label for="id_refer" class="control-label">Refer</label><select name="refer" id="id_refer" class="form-control">
    <option selected="selected" value="please choose one">Please Choose One</option>
    <option value="google search">Google Search</option>
    <option value="facebook">Facebook</option>
    <option value="other">Other</option>
<div id="other">
    {% bootstrap_field wizard.form.other %}
<div style="text-align: center;">
    <button type="submit" class="button-main">Next</button>

I added javascript to show or hide the other field depending on which option was selected

jQuery('#id_refer').on('change', function() {
    if (this.value == 'other' ) {
    else {

then in the form processing logic I check to see if the value of the field is "other" and if it is I replace other with the value of the extra field. Here, I'm calling form.save(commit=False) to obtain the data from the form without committing it to the database. Then I'm adjusting the value of the fields based on post-processing logic, before saving the form to the database.

registration_form = form.save(commit=False)
if registration_form.refer == 'other':
    form_data = self.get_form_step_data(form)
    registration_form.refer = form_data.get('other', '')

You can also add validation logic or raise a ValidationError if you need to require a value for that field.