首页 > 解决方案 > Django:使用条件 login_required 查看

问题描述

给定视图,latest_objs如果 URL 中有参数,我希望视图有条件地要求登录。

目标:

  1. 如果传递的 URL 是,则返回与任何特定用户无关latest-objs的非认证视图。objs

  2. 如果传递的 URL 是latest-objs/mine,如果用户未通过身份验证,我想要求登录,因为该版本的视图应该返回objs与经过身份验证的用户相关的内容。

问题:

  1. 这样做是正确的方法来检查request.GET.get('some-param')?
  2. 我将如何在我的urls.py文件中定义这两个场景?目前我有这个:

    url(r'latest-objs', views.latest_objs, name='latest_objs'),
    

有点题外话:我想知道是否值得为此烦恼,或者只是创建两个不同的视图。

标签: djangodjango-viewsdjango-urls

解决方案


request.GET当您的 URL 有查询字符串时使用,例如/latest-objs?owner=me.

对于 URL /latest-objs/mine,您必须修改您的 URL 模式,或添加一个新的。我更喜欢添加一个新的 URL 模式,因为我认为它更具可读性。您可以使用新视图,

url(r'latest-objs/mine', views.my_objs, name='my_objs'),

或使用相同的视图,并传递mine给视图,以便您可以判断匹配的 URL 模式。

url(r'latest-objs/mine', views.latest_objs, {'mine': True}, name='my_objs'),

如果您采用后一种方法,那么您需要更新视图以接受mine作为参数。

def latest_objs(request, mine=False):
    ...

您是否重用相同的视图或不同的视图是一个判断问题,在我看来,这取决于视图。对于一个简单的视图,一个单独的视图将是最直接的,因为您可以使用登录所需的装饰器或 mixins 来处理重定向。对于更复杂的视图,单独的视图可能会导致代码重复。


推荐阅读