基于类的视图中的可选 url 参数

Posted

技术标签:

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

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

例如:

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

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

【问题讨论】:

你能发布一些代码来展示你想要做什么吗? 【参考方案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

以上是关于基于类的视图中的可选 url 参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码

基于hashtag的可选视图

带有参数的 Django 反向 url 到基于类的视图

在基于类的视图中使用多个 URL 参数来获取对象

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

Django:向视图中的请求添加可选参数