简体   繁体   中英

How to add parameters to urls in Django?

I have a view that filters the field called "defaultfieldname" in a certain object_list. What I want to do is to adapt it to pass the name of the field as as parameter in urls.py, so I could use different urls for different fields.

I am not sure which way would be easier:

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"),

or

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'),

Then I have a view:

class MonthCalends(ListView):
    template_name='month_list.html'
    ## Sets default fieldname value
    filter_field = "defaultfieldname"
    ...rest of code

The param in urls.py should overwrite the "defaultfieldname" on the view, but I don't know how to get the filter_field from the urls.py in the view. Any help?

Thanks!

The arguments you send with as_view are set on the MonthCalends object. That means filter_field is available as self.filter_field . Assuming you have defined the get method you could do as follows:

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

For a more full explanation check the Django class based views documentation .

You may just use one url, that triggers the second part of your url:

url(r'^calendar/(\w+)$', login_required(MonthCalends.as_view(model=Person)), name='bday_list'),

Then you may access it using self.args[0]

And in case you just permit two different types for filter_field , you may just raise an exception later in the class that you have read self.args[0] .

Of course, you may use more readable syntax in the regex like:

r'^calendar/(?P<type>\w+)$'

In this case you can access it using self.kwargs['type'] .

Anyway, using regex groups seems much neater.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM