Django: as_view() 在表单视图中调用的第一个方法是什么
我有一个网址配置是 /book/(?P<book_id>\d+)/(?P<page_id>\d+)/edit/
,这个网址会用到 django.views.generic.edit.FormView
来处理请求。
当请求一发出,我需要检查一下是否有一个 Book
对象存在,且这个对象的 book_id
是有效的,同时还要确认这个书籍里是否有对应的页面,使用 page_id
来查。
那么,在哪里进行这些检查比较合适呢?我还想把这些信息存储为实例属性,以便后续需要时使用。
补充说明
这里还有个棘手的地方,就是使用的 form_class
完全依赖于找到的对象!
目前在我们基于函数的视图中,会用一个装饰器来处理这个问题。但在基于类的视图中,我不太确定应该在哪里进行这些操作。
在典型的基于函数的视图中
def get_object_or_404(view_function):
def decorator(request, book_id, page_id):
return view_function(request, book, page)
return decorator
@get_book_or_404
def edit_book(self, book, page):
# process the page
return HttpResponse()
我其实是在寻找一个和 get_book_or_404
功能相当的简单方法,用于基于类的视图。
1 个回答
0
其实你不需要太在意在视图中第一个调用的是哪个方法。关键是把逻辑放在合适的地方。在这个情况下,因为你需要获取实例,所以你应该重写一下 get_object
这个方法。在这个方法里,你可以返回 book
对象,同时也可以把书和页面对象存储为实例的属性。