我有一个视图,在某个object_list中过滤名为“defaultfieldname”的字段。我想要做的是调整它以传递字段的名称作为urls.py中的参数,所以我可以为不同的字段使用不同的URL。
我不确定哪种方式会更容易:
url(r'^calendar/birthday/$', login_required(MonthCalends.as_view(model=Person)), name='bday_list', filter_field="birthdate"),
url(r'^calendar/deathday/$', login_required(MonthCalends.as_view(model=Person)), name='dday_list', filter_field="deathdate"),
或
url(r'^calendar/birthday/$', login_required(MonthCalends.as_view(model=Person, filter_field="birthdate")), name='bday_list'),
url(r'^calendar/deathday/$', login_required(MonthCalends.as_view(model=Person, filter_field="deathdate")), name='dday_list'),
然后我有一个观点:
class MonthCalends(ListView):
template_name='month_list.html'
## Sets default fieldname value
filter_field = "defaultfieldname"
...rest of code
urls.py中的param应覆盖视图中的“defaultfieldname”,但我不知道如何从视图中的urls.py获取filter_field。有什么帮助吗?
谢谢!
答案 0 :(得分:2)
使用as_view
发送的参数在MonthCalends对象上设置。这意味着filter_field
可用self.filter_field
。假设您已经定义了get
方法,您可以执行以下操作:
class MonthCalends(ListView):
template_name='month_list.html'
## Sets default fieldname value
filter_field = "defaultfieldname"
def get(self, request, *args, **kwargs):
try:
# if the filter field was sent as an argument
filter_field = self.filter_field
except:
# else revert to default
filter_field = MonthCalends.filter_field
# ...rest of code
要获得更完整的说明,请查看Django class based views documentation。
答案 1 :(得分:1)
您可以使用一个网址,触发网址的第二部分:
url(r'^calendar/(\w+)$', login_required(MonthCalends.as_view(model=Person)), name='bday_list'),
然后您可以使用self.args[0]
如果您只为filter_field
允许两种不同的类型,您可能只会在您阅读self.args[0]
的课程中稍后提出异常。
当然,您可以在正则表达式中使用更易读的语法,如:
r'^calendar/(?P<type>\w+)$'
在这种情况下,您可以使用self.kwargs['type']
。
无论如何,使用正则表达式组似乎更整洁。