1

我有一个视图可以过滤某个 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 中的参数应该覆盖视图上的“defaultfieldname”,但我不知道如何从视图中的 urls.py 中获取 filter_field。有什么帮助吗?

谢谢!

4

2 回答 2

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 类的视图文档

于 2012-08-21T01:24:05.773 回答
1

您可以只使用一个 url,它会触发您的 url 的第二部分:

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'].

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

于 2012-08-21T00:44:40.100 回答