Подтвердить что ты не робот

Необязательно получить параметры в django?

Может кто-нибудь объяснить, как вы можете написать шаблон url и просмотр, который позволяет использовать дополнительные параметры? Я сделал это успешно, но я всегда нарушаю тег шаблона url.

Вот что у меня есть:

шаблон

(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so')

Просмотр

def so(request, required, optional):

Если я использую тег шаблона url в этом примере, предоставляя оба аргумента, он работает отлично; однако, если я опускаю необязательный аргумент, я получаю ошибку реверса.

Как я могу это сделать?

Спасибо, Пит

4b9b3361

Ответ 1

Я обычно делаю два шаблона с с именем url:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='something'),
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='something_else'),

Ответ 2

URL-адреса Django являются полиморфными:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='sample_view'),
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='sample_view'),

его опасно, что вы должны сделать свое мнение следующим образом:

def sample_view(request, required, optional = None):

чтобы вы могли называть его с тем же именем, и это сработало бы корректно. Однако имейте в виду, что вы не можете передать None в качестве требуемого аргумента и ожидать, что он приведет вас к regexp без аргументов:

Неверно:

{% url sample_view required optional %}

Правильно:

{% if optional %}
    {% url sample_view required optional %}
{% else %}
    {% url sample_view required %}
{% endif %}

Я не знаю, документировано ли это где угодно - я случайно обнаружил это - я забыл переписать имена URL-адресов, и он все равно работает:)

Ответ 3

Другие продемонстрировали способ справиться с этим двумя отдельными шаблонами URL-адресов. Если повторение части шаблона URL-адреса беспокоит вас, вы можете избавиться от него, используя include():

url(r'^so/(?P<required>\d+)/', include('myapp.required_urls'))

Затем добавьте файл required_urls.py с помощью

url(r'^$', 'myapp.so', name='something')
url(r'^(?P<optional>.+)/$', 'myapp.so', name='something_else')

Обычно я бы не счел это стоящим, если не существует общего префикса для целого ряда URL-адресов (конечно, более двух).

Ответ 4

Почему бы не создать два шаблона:

(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', view='myapp.so', name='optional'),
(r'^so/(?P<required>\d+)/$', view='myapp.so', kwargs={'optional':None}, name='required'),

Ответ 5

Для тех, кто все еще сталкивается с этой проблемой. Я использую Django 1.5 (обновлено: с использованием 1.8), и он все еще работает нормально.

Я использую:

urls.py

url(r'^(?P<app_id>\d+)/start/+(?P<server_id>\d+)?', views.restart, name='restart')

Тогда, когда я хочу иметь два URL

/1/start/2

и

/1/start

Я использую:

{% url '<namespace>:start' app.id %}
{% url '<namespace>:start' app.id server.id %}

Это создаст URL-адреса

/1/start/2 and 
/1/start/ <- notice the slash.

Если вы создаете URL-адрес вручную, вы должны держать/в виду.

Я обругаю это, помогает любому!

Ответ 6

в views.py вы делаете простую вещь.

def so(request, required, optional=None): 

И когда вы не получите необязательный параметр в строке url, в вашем коде будет None.

Простой и элегантный:)

Ответ 7

В зависимости от вашего варианта использования вы можете просто передать параметр url следующим образом:

url/?parameter=foo

назовите это в своем представлении:

request.REQUEST.get('parameter')

это вернет 'foo'