Os parâmetros predefinidos para ações com Django
-
04-07-2019 - |
Pergunta
Existe uma maneira de ter um parâmetro padrão passado para uma ação no caso em que o regex não funcionavam jogo qualquer coisa usando django?
urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))
#myview.py
def displayName(request,name):
# write name to response or something
Eu tentei definir o terceiro parâmetro nas urlpatterns a um dicionário contendo 'e dando o nome do parâmetro um valor padrão no método, nenhum dos quais trabalharam. o parâmetro de nome sempre parece ser nenhum. Eu quero realmente não ao código um cheque para Nenhum se eu poderia definir um valor padrão.
Esclarecimento:. Aqui é um exemplo do que eu estava mudando-o para
def displayName(request,name='Steve'):
return HttpResponse(name)
#i also tried
urlpatterns = patterns('',
(r'^test/(?P<name>.*)?$',
'myview.displayName',
dict(name='Test')
)
)
quando eu aponto meu navegador com a vista que exibe o texto 'Nenhum'
Todas as idéias?
Solução
O problema é que quando o padrão é comparado com 'test /' o groupdict capturado pelo regex contém o 'nome' mapeamento => Nenhum:
>>> url.match("test/").groupdict()
{'name': None}
Isto significa que quando a vista é invocado, usando algo que eu esperaria que é semelhante ao abaixo:
view(request, *groups, **groupdict)
o que equivale a:
view(request, name = None)
para 'test /', o que significa que o nome é atribuído Nenhum invés de não atribuído.
Este o deixa com duas opções. Você pode:
- explicitamente verificar se há Nenhum no código vista que é tipo de hackish.
- Reescreva a regra url expedição para tornar o nome de captura não opcional e introduzir uma segunda regra de captura quando nenhum nome é fornecido.
Por exemplo:
urlpatterns = patterns('',
(r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
(r'^test/$','myview.displayName'),
)
Quando tirar a segunda abordagem, você pode simplesmente chamar o método sem o padrão de captura, e deixe alça python o parâmetro padrão ou você pode chamar uma visão diferente que delegados.
Outras dicas
I pensei você poderia def displayName(request, name=defaultObj)
; isso é o que eu fiz no passado, pelo menos. O que você estava definindo o valor padrão para?