如何在Django中为url添加参数?

时间:2012-08-21 00:01:59

标签: python django views field

我有一个视图,在某个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。有什么帮助吗?

谢谢!

2 个答案:

答案 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']

访问它

无论如何,使用正则表达式组似乎更整洁。