Django's forms.Form vs forms.ModelForm

我们两清 提交于 2019-12-18 10:00:28

问题


Could anyone explain to me similarities and differences of Django's forms.Form & forms.ModelForm?


回答1:


Forms created from forms.Form are manually configured by you. You're better off using these for forms that do not directly interact with models. For example a contact form, or a newsletter subscription form, where you might not necessarily be interacting with the database.

Where as a form created from forms.ModelForm will be automatically created and then can later be tweaked by you. The best examples really are from the superb documentation provided on the Django website.

forms.Form:
Documentation: Form objects
Example of a normal form created with forms.Form:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

forms.ModelForm:
Documentation: Creating forms from models
Straight from the docs:

If your form is going to be used to directly add or edit a Django model, you can use a ModelForm to avoid duplicating your model description.

Example of a model form created with forms.Modelform:

from django.forms import ModelForm
from . import models

# Create the form class.
class ArticleForm(ModelForm):
    class Meta:
        model = models.Article

This form automatically has all the same field types as the Article model it was created from.




回答2:


The similarities are that they both generate sets of form inputs using widgets, and both validate data sent by the browser. The differences are that ModelForm gets its field definition from a specified model class, and also has methods that deal with saving of the underlying model to the database.




回答3:


Here's how I'm extending the builtin UserCreationForm myapp/forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm


class RegisterForm(UserCreationForm):

    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    email = forms.CharField(max_length=75)

    class Meta(UserCreationForm.Meta):
        fields = ('username','first_name','last_name', 'email')


来源:https://stackoverflow.com/questions/2303268/djangos-forms-form-vs-forms-modelform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!