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?

Foi útil?

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:

  1. explicitamente verificar se há Nenhum no código vista que é tipo de hackish.
  2. 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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top