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

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

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

Шаблон

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

Посмотреть

 def so(request, required, optional): 

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

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

Спасибо, Пит

7 Solutions collect form web for “Необязательно получить параметры в django?”

Обычно я делаю два шаблона с именованным URL :

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

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-адресов, и он все равно работает 🙂

Другие продемонстрировали способ справиться с этим двумя разными шаблонами 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 (конечно, более двух).

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

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

Для тех, кто все еще сталкивается с этой проблемой. Я использую 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-адрес вручную, вы должны держать / в виду.

Я обругаю это, помогает кому угодно!

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

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

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

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

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

 url/?parameter=foo 

назовите это на ваш взгляд:

 request.REQUEST.get('parameter') 

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

  • Удаление html-тегов изображений и всего, что происходит между строкой
  • Может ли pexpect сказать, чтобы игнорировать шаблон или сигнал?
  • Регулярное выражение Python: включение пробела внутри диапазона символов
  • Может ли регулярное выражение использоваться в качестве ключа в словаре?
  • Как найти лучшее совпадение с нечеткой строкой?
  • Два очень близких регулярных выражения с утверждениями в Python - почему re.split () ведет себя по-другому?
  • Более быстрый способ удаления стоп-слов в Python
  • Необязательные именованные группы Python re
  • Неожиданная ошибка NoReverseMatch при использовании include () в шаблонах URL-адресов
  • Python web scraping, считая появление списка слов на каждой странице
  • Извлечь дату и значение валюты (разделенные запятой) из файла
  • Python - лучший язык программирования в мире.