【问题标题】:Optional url parameters in class based views基于类的视图中的可选 url 参数
【发布时间】:2013-01-03 23:14:18
【问题描述】:

如何使用基于类的视图为 url 参数创建默认值?以 TemplateView 为例

例如:

url(r'^(?P<num>\d+)|/$', MyView.as_view())

如果 url 中没有指定 num,我想设置默认值 '4'

【问题讨论】:

  • 你能发布一些代码来展示你想要做什么吗?

标签: python django django-urls django-class-based-views


【解决方案1】:

如果您指定的正则表达式包含以下名称:

url(r'^(?P<num>\d+)|/$', MyView.as_view())

然后num 将始终作为关键字参数传递给您的视图函数。如果正则表达式匹配但没有 num 匹配,则 num 将作为 None 传递给您的视图。

给定以下视图函数:

def get(self, request, *args, **kwargs):
    print 'args %s' % repr(args)
    print 'kwargs %s' % repr(kwargs)

runserver打印的输出如下:

# url: /
args ()
kwargs {'num': None}

# url: /45/
args ()
kwargs {'num': u'45'}

检测None 值并酌情分配默认值由您决定。

def get(self, request, *args, **kwargs):
    num = kwargs.get('num', None)
    if num is None:
        num = 4

【讨论】:

    【解决方案2】:

    如果 num 没有在 URL 中指定,那么 Django 将不会使用 urls.py 中的那一行来显示页面。您可以像这样修改您的 URL 配置来实现这一点:

    url(r'^$', MyView.as_view())
    url(r'^(?P<num>\d+)|/$', MyView.as_view())
    

    MyView中,你可以通过以下方式获取参数:

    def get(self, request, *args, **kwargs):
        my_url = request.GET.get('url', 4)
    

    将 URL 中给定的值分配给 my_url 或 4 作为默认值。

    【讨论】:

    • 我强烈建议避免覆盖get,除非绝对必要。基于类的视图提供了一堆更适合于此的方法,具体取决于您要子类化的实际 View 类以及您打算如何使用此参数。例如,如果你需要它来实例化DetailView中的对象,覆盖get_object;如果你只是想在模板中使用它,使用get_context_data;等等。
    • @BerislavLopac 同意。这是让 CBV 有点尴尬的一件事——您需要知道要覆盖哪种方法。做事的方法不止一种,如果没有适当的经验,不清楚要覆盖哪种方法。
    • 我将把这两个资源留给 Django 和 Django Rest,这在使用 django 时是绝对必要的。它是关于每个类和每个函数的 CBV 文档,可以轻松复制以正确覆盖函数 ccbv.co.uk cdrf.co
    猜你喜欢
    • 2016-03-31
    • 2013-03-23
    • 2015-04-30
    • 1970-01-01
    • 2012-01-25
    • 2023-03-23
    • 2018-12-09
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多