Django: as_view() 在表单视图中调用的第一个方法是什么

0 投票
1 回答
609 浏览
提问于 2025-04-18 04:36

我有一个网址配置是 /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 对象,同时也可以把书和页面对象存储为实例的属性。

撰写回答