现在,我可以在模型中创建所有必需的数据库字段。
我可以创建表单来访问这些模型。
如果我从模特创建表单:
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中那样做了吗?
非常感谢。
答案 0 :(得分:3)
如果你有一个名为Author
的模型,建立在gruszczy said的基础上,你可以为这个模型声明ModelForm
:
class AuthorForm(forms.ModelForm): # Note the different superclass.
class Meta:
model = Author
如果您想要一个包含Author
的所有属性的表单,那么您就需要这样做。但是,如果您只需要Author
的属性的一部分(例如name
和title
),那么您可以修改模型形式:
class AuthorForm(forms.ModelForm): # Note the different superclass.
class Meta:
model = Author
fields = ('name', 'title',)
请注意,您不必在此使用CharField
。
另一方面,如果你想要除 name
和title
之外的所有内容,那么你可以像这样定义你的表单:
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
中)。也许这就是问题所在。你能描述一下你的哪个型号有问题吗?