【问题标题】:Django class based generic view redirect基于 Django 类的通用视图重定向
【发布时间】:2014-01-28 14:50:54
【问题描述】:

考虑以下几点:

urls.py:

urlpatterns = patterns('',
    ('^test/$', ClassView.as_view()),
)

views.py:

class ClassView(View):
    def get(self, request):
        return HttpResponse("test")
    def post(self, request):
        # do something
        return redirect(ClassView.get(request)) # What should I do to redirect to a class here without specifying the path?

我想重定向到 ClassView 的 get 函数 (/test/),但是当我尝试上述方法时,我得到:

NoReverseMatch at /test/

所以它显然找到了 URL 但说没有匹配?

【问题讨论】:

    标签: python django


    【解决方案1】:

    你应该只命名你的 urlpattern 并重定向到那个,这将是最 Django-ey 的方式。

    它没有记录(因此不能保证在未来的 Django 版本中工作)但 redirect 快捷方式可以采用视图功能,所以你可以几乎redirect(ClassView.as_view()) ...我说几乎是因为这实际上不起作用 - 每次调用 as_view() 时,都会返回一个 new 视图函数,因此 redirect 不会将其识别为与 urlconf 中相同的视图。

    所以要做你想做的事,你必须像这样更新你的 urlconf:

    from .views import test_view
    
    urlpatterns = patterns('',
        ('^test/$', test_view),
    )
    

    在你的views.py中

    class ClassView(View):
        def get(self, request):
            return HttpResponse("test")
    
        def post(self, request):
            # do something
            return redirect(test_view)
    
    test_view = ClassView.as_view()
    

    但我仍然认为你应该这样做:

    urlpatterns = patterns('',
        url('^test/$', ClassView.as_view(), name="test"),
    )
    

    .

    class ClassView(View):
        def get(self, request):
            return HttpResponse("test")
    
        def post(self, request):
            # do something
            return redirect("test")
    

    【讨论】:

    • 如果post 方法中没有任何自定义,那么更简洁的方法是使用django.views.generic.edit.FormMixin之类的mixin声明ClassView,然后添加success_url 类成员声明,​​@ 987654333@。那么可以完全省略post的声明。
    • @nmgeek 是的,好点! ...尽管 OP 在 post 方法中确实有 # do something 评论,这表明可能正在发生一些自定义的事情
    【解决方案2】:

    您是否应该将名称设置为您的 urlpattern 并重定向到该名称?

    【讨论】:

    • 这是一种选择,但如果可能的话,我宁愿只重定向到类名。
    • 正如@anentropic 已经回答的那样,可以重定向到预实例化的视图类。但是如果你在项目的其他地方使用它,你的重定向可能会被破坏,因为 Django 不知道哪个 urlpattern 是正确的。
    【解决方案3】:
    def post(self, request, *args, **kwargs):
        return HttpResponseRedirect(request.path)
    

    这将重定向到与您的 post() 相同的 URL,然后由您的 get() 处理。

    【讨论】:

      【解决方案4】:

      尝试返回self.get()。我没有测试。但作为它的python代码,它应该可以工作。如果您只想执行语句,请使用此选项。我认为这不会返回任何 HTTP 302 状态。

      【讨论】:

        猜你喜欢
        • 2011-09-10
        • 2017-06-01
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 2021-09-25
        • 2016-08-06
        • 2011-10-04
        • 2012-02-21
        相关资源
        最近更新 更多