Login

Reusable form template with generic view

Author:
roldandvg
Posted:
December 2, 2015
Language:
HTML/template
Version:
1.7
Tags:
generic custom django crud reusable forms dynamic-form dynamic bootstrap html modelform generic-views template fields form
Score:
0 (after 0 ratings)

If you require lots of forms in your project and do not want to be creating an extended template for each one I propose this solution.

Classes in the html correspond to bootstrap, you can work without them if you do not use bootstrap.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# model.py
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    gender = models.CharField(max_length=1, choices=[('M', 'Male'),('F','Female')])
    birthdate = models.DateField()

# forms.py
from django.forms import ModelForm, TextInput, ChoiceField, Select
from myapp.models import Person # change myapp for you app

class PersonForm(ModelForm):
    gender = ChoiceFields(
        label='gender',
        choices=[('M', 'Male'),('F','Female')],
        widget=Select(attrs={'class': 'form-control'})
    )

    class Meta:
        model = Person
        fields = '__all__'
        widgets = {
            'first_name': TextInput(attrs={'class': 'form-control'}),
            'last_name': TextInput(attrs={'class': 'form-control'}),
            'birthdate': TextInput(attrs={'class': 'form-control'})
        }

# generic-form.html

<form role="form" class="form" method="{% block form_method %}post{% endblock %}" enctype="multipart/form-data">
    {% csrf_token %}
    {# Only add visible fields #}
    {% for field in form.visible_fields %}
        <div class="col-md-2">
            <div class="form-group">
                <label class="control-label" for="{{ field.auto_id }}">{{ field.label }}</label>
                {{ field }}
                {% if field.errors %}
                    <div class="control-label" for="inputError">
                        {{ field.errors.as_text }}
                    </div>
                {% endif %}
            </div>
        </div>
    {% endfor %}
    {% for field in form.hidden_fields %}{{field}}{% endfor %}
    <div class="col-md-12">
        <button type="submit" class="btn btn-success">submit</button>
    </div>
</form>

# view.py
from django.core.urlresolvers import reverse_lazy
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic import CreateView
from myapp.models import Person
from myapp.forms import PersonForm

class PersonCreate(SuccessMessageMixin, CreateView):
    model = Person
    form_class = PersonForm
    template = 'generic-form.html'
    success_url = reverse_lazy('url_to_success') # Change for you url success
    success_message = 'message_to_success' # Change for you message success

More like this

Comments

Please login first before commenting.