基于类的视图中的可选 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 中硬编码