Eu tenho uma URL do Django assim:
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
O problema é que eu quero que o project_id
parâmetro seja opcional.
Eu quero /project_config/
e /project_config/12345abdce/
ser padrões de URL igualmente válidas, de modo que , se project_id
for aprovada, então eu posso usá-lo.
Como está no momento, recebo um 404 quando acesso o URL sem o project_id
parâmetro
python
django
django-views
django-urls
Darwin Tech
fonte
fonte
Você pode usar rotas aninhadas
Django <1.8
Django> = 1.8
Isso é muito mais seco (
product
digamos que você queira renomear o kwarg paraproduct_id
, você só precisa alterar a linha 4 e isso afetará os URLs abaixo.Editado para Django 1.8 e superior
fonte
Ainda mais simples é usar:
O "(a | b)" significa a ou b; portanto, no seu caso, seriam um ou mais caracteres da palavra (\ w +) ou nada.
Então seria assim:
fonte
None
. Significando que você não pode confiar em um valor padrão na assinatura da exibição para isso: você deve testá-lo explicitamente por dentro e atribuir em conseqüência.Django> versão 2.0 :
A abordagem é essencialmente idêntica à apresentada na resposta de Yuji 'Tomita' Tomita . Afetado, no entanto, é a sintaxe:
Usando
path()
você também pode passar argumentos extras para uma visão com o argumento opcionalkwargs
que é do tipodict
. Nesse caso, sua visualização não precisaria de um padrão para o atributoproject_id
:Para saber como isso é feito na versão mais recente do Django , consulte os documentos oficiais sobre o envio de URL .
fonte
project_id
o caminho ainda no caso do padrão usando adict
. Isso pode levar a um comportamento aparentemente estranho, pois o argumento fornecido nodict
sempre será usado (se bem me lembro).Pensei em acrescentar um pouco à resposta.
Se você tiver várias definições de URL, precisará nomear cada uma delas separadamente. Portanto, você perde a flexibilidade ao chamar reverso, pois um reverso espera um parâmetro enquanto o outro não.
Outra maneira de usar o regex para acomodar o parâmetro opcional:
fonte
Reverse for 'edit_too_late' with arguments '()' and keyword arguments '{'pk': 128}' not found. 1 pattern(s) tried: ['orders/cannot_edit/((?P<pk>\\d+)/)?$']
Django = 2.2
fonte
Usar ? funcionar bem, você pode verificar em pythex . Lembre-se de adicionar os parâmetros * args e ** kwargs na definição dos métodos de exibição
fonte