实际上,Django 的 generic 基于类的视图并不是无缘无故称为泛型的。
您可以查看ListView和CreateView的来源。
ListView 有一个 GET 方法处理程序:
class BaseListView(MultipleObjectMixin, View):
"""A base view for displaying a list of objects."""
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
allow_empty = self.get_allow_empty()
if not allow_empty:
# ...
context = self.get_context_data()
return self.render_to_response(context)
它返回一个有效的 Django 响应并且可以在 tests.py 中测试。
如果您查看CreateView,它继承自BaseCreateView(就像ListView 继承自BaseListView):
class BaseCreateView(ModelFormMixin, ProcessFormView):
"""
Base view for creating an new object instance.
Using this base class requires subclassing to provide a response mixin.
"""
def get(self, request, *args, **kwargs):
# ...
def post(self, request, *args, **kwargs):
# ...
也继承自ProcessFormView:
class ProcessFormView(View):
"""Render a form on GET and processes it on POST."""
def get(self, request, *args, **kwargs):
"""Handle GET requests: instantiate a blank version of the form."""
return self.render_to_response(self.get_context_data())
def post(self, request, *args, **kwargs):
"""
Handle POST requests: instantiate a form instance with the passed
POST variables and then check if it's valid.
"""
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
GET 请求将产生一个有效的响应。如您所见,这里的 POST 方法处理程序根据表单状态返回 self.form_valid(form) 或 self.form_invalid(form)。
这两个方法的来源可以在ViewMixin看到:
def form_valid(self, form):
"""If the form is valid, redirect to the supplied URL."""
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form):
"""If the form is invalid, render the invalid form."""
return self.render_to_response(self.get_context_data(form=form))
这两种方法都返回一个有效的可测试 Django 响应。
总之,你的ListBlogPostView和CreateBlogPostView都可以直接在tests.py中测试。您只需要更详细地查看the implementation of Django's generic views。 开源的力量!