У меня есть URL Django, как это:
url(
r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$',
'tool.views.ProjectConfig',
name='project_config'
),
views.py:
def ProjectConfig(request, product, project_id=None, template_name='project.html'):
...
# do stuff
Проблема в том, что я хочу, чтобы project_id
параметр был необязательным.
Я хочу /project_config/
и /project_config/12345abdce/
быть равноценными шаблоны URL, так что , если project_id
будет принят, то я могу использовать его.
В настоящее время, я получаю 404, когда я получаю доступ к URL без project_id
параметра.
источник
Вы можете использовать вложенные маршруты
Джанго <1,8
Джанго> = 1.8
Это намного более СУХОЙ (скажем, вы хотите переименовать
product
kwargproduct_id
, вам нужно только изменить строку 4, и это повлияет на приведенные ниже URL-адреса.Отредактировано для Django 1.8 и выше
источник
Еще проще использовать:
«(A | b)» означает a или b, поэтому в вашем случае это будет один или несколько символов слова (\ w +) или ничего.
Так это будет выглядеть так:
источник
None
. Это означает, что вы не можете полагаться на значение по умолчанию в сигнатуре представления для этого: вы должны явно проверить его внутри и назначить в последствии.Django> версия 2.0 :
Подход, по сути, идентичен подходу, приведенному в «Томита» в ответе Юджи «Томита» . Затрагивается, однако, синтаксис:
Используя
path()
вы также можете передать дополнительные аргументы в представление с необязательным аргументом,kwargs
который имеет типdict
. В этом случае вашему представлению не понадобится значение по умолчанию для атрибутаproject_id
:О том, как это сделать в самой последней версии Django , см. В официальных документах об отправке URL .
источник
project_id
путь в случае, если по умолчанию используется adict
. Это может привести к странному поведению, так какdict
всегда будет использоваться аргумент, приведенный в (если я правильно помню).Думаю, я бы немного добавил к ответу.
Если у вас есть несколько определений URL, вам нужно будет назвать каждое из них отдельно. Таким образом, вы теряете гибкость при вызове реверса, поскольку один реверс будет ожидать параметр, а другой - нет.
Еще один способ использования регулярных выражений для размещения необязательного параметра:
источник
Reverse for 'edit_too_late' with arguments '()' and keyword arguments '{'pk': 128}' not found. 1 pattern(s) tried: ['orders/cannot_edit/((?P<pk>\\d+)/)?$']
Джанго = 2,2
источник
Использовать? работать хорошо, вы можете проверить на pythex . Не забудьте добавить параметры * args и ** kwargs в определение методов представления
источник