Необязательно получить параметры в 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'

  • Почему поиск в регулярном выражении в подстроке «не полностью эквивалентен разрезанию строки» в Python?
  • Python - регулярное выражение - разбиение строки перед словом
  • Могу ли я использовать именованные группы в регулярном выражении Perl для получения результатов в хеше?
  • Найти конкретную ссылку w / beautifulsoup
  • Python - анализировать IPv4-адреса из строки (даже при цензуре)
  • Проверка Python на действительный адрес электронной почты?
  • Python + Regex + UTF-8 не распознает акценты
  • множественное разделение в строке с использованием регулярного выражения
  •  
    Interesting Posts for Van-Lav

    Найти все перестановки строк в Python

    Как я должен декодировать байты (используя ASCII), не теряя байтов «мусора», если xmlcharrefreplace и backslashreplace не работают?

    Есть ли хороший способ отправить данные из контекста python на C ++ без использования слишком большой копии

    python top N количество слов, почему многопроцессор медленнее, чем один процесс

    Предсказание следующего слова с использованием примера тензорного потока модели ptb LSTM

    Может ли строка кода Python знать уровень вложенности вложения?

    Как можно отключить вывод терминалов на исполняемые файлы, выполняемые функциями Python, в общем?

    Вычисление e (база естественного журнала) с высокой точностью в Python?

    Использование xlsxwriter в Google App Engine для Python

    Проблема с Pygame на Mac OSX

    Импортировать urllib или urllib 2 в Python 2.7 с помощью ImportError: невозможно импортировать имя iskeyword

    (Django) Обрезать пробелы из charField

    Python: lxml xpath получает два разных класса

    Проверка Django: см. Traceback, где создается неправильный ответ

    Разбор YAML и Python?

    Python - лучший язык программирования в мире.