通用视图和模型表单不是排他性的概念;通用视图包含特定功能的业务逻辑,而 ModelForms 从模型逻辑创建表单、验证/数据清理逻辑和 CRUD 功能。
使用下面的示例(来自docs),UpdateView(作为 Django 的一部分提供的通用视图)从单个模型实例创建模型表单。通过 CBV 约定,要更新的实例的主键应该是 url 提供的第一个位置参数。
在这种情况下,会自动生成一个 ModelForm。当需要更细粒度的控制时,您可以定义自己的 ModelForm 并将其提供给 CBV。希望这有助于消除您的困惑。
示例 myapp/views.py:
from django.views.generic.edit import UpdateView
from myapp.models import Author
from django import forms
class MyModelForm(forms.ModelForm):
model = Author
fields = ['name', 'city', ...]
class AuthorUpdate(UpdateView):
model = Author
form = MyModelForm
template_name_suffix = '_update_form'
示例 myapp/author_update_form.html:
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update" />
</form>
示例 myapp/urls.py
from django.conf.urls import *
from myapp.views import AuthorUpdate
urlpatterns = patterns('',
url('^update_author/(?P<pk>[\w-]+)$', AuthorUpdate.as_view(), name='update_author'),
)