形式,模型,模型形式

时间:2010-08-23 09:52:13

标签: django django-forms

现在,我可以在模型中创建所有必需的数据库字段。

我可以创建表单来访问这些模型。

如果我从模特创建表单:

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

我无法理解,为什么我必须重新定义这些字段:

class AuthorForm(forms.Form):
    name = forms.CharField(max_length=100)
    title = forms.CharField(max_length=3,
                widget=forms.Select(choices=TITLE_CHOICES))
    birth_date = forms.DateField(required=False)

为什么我必须在这里定义CharField? 我不是已经在models.py中那样做了吗?

非常感谢。

2 个答案:

答案 0 :(得分:3)

如果你有一个名为Author的模型,建立在gruszczy said的基础上,你可以为这个模型声明ModelForm

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta:
        model = Author

如果您想要一个包含Author所有属性的表单,那么您就需要这样做。但是,如果您只需要Author的属性的一部分(例如nametitle),那么您可以修改模型形式:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta:
        model = Author
        fields = ('name', 'title',)

请注意,您不必在此使用CharField

另一方面,如果你想要除 nametitle之外的所有内容,那么你可以像这样定义你的表单:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta:
        model = Author
        exclude = ('name', 'title',)

<强>更新

(阅读评论后)您可以将AuthorForm视为any other regular form。在您的视图中,您可以根据request.method实例化此表单,包含或不包含数据。像这样:

def add_author(request, *args, **kwargs):
    if request.method == 'GET':
        form = AuthorForm()

    elif request.method == 'POST':
        form = AuthorForm(request.POST.copy())
        if form.is_valid():
             author = form.save()
             # Redirect to listing etc.

    context = dict(form = form)
    return render_to_response(template_name, context) # etc.

在你的模板中:

{{ form.as_p }}

different ways来呈现表单; as_p只是其中之一。

答案 1 :(得分:1)

您正在使用forms.Form而不是forms.ModelForm并声明您正在使用的模型(在class Meta中)。也许这就是问题所在。你能描述一下你的哪个型号有问题吗?