Os parâmetros predefinidos para ações com Django

votos
3

Existe uma maneira de ter um parâmetro padrão passado para uma ação no caso em que o regex não precisava corresponder a tudo usando Django?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))

#myview.py
def displayName(request,name):
      # write name to response or something

Tentei definir o terceiro parâmetro nas urlpatterns a um dicionário contendo 'e dando o parâmetro nome de um valor padrão no método, nenhum dos quais trabalharam. o parâmetro de nome sempre parece ser nenhum. Eu realmente não quero codificar um cheque para Nenhum se eu poderia definir um valor padrão.

Esclarecimento: aqui está um exemplo do que eu estava mudando ele.


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'

Alguma ideia?

Publicado 24/10/2008 em 19:12
fonte usuário
Em outras línguas...                            


2 respostas

votos
8

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.

Isso deixa você com duas opções. Você pode:

  1. Explicitamente verificar se há Nenhum no código vista que é tipo de hackish.
  2. Reescrever a regra url expedição para fazer a captura de nome não opcional e introduzir uma segunda regra para capturar quando nenhum nome é fornecido.

Por exemplo:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
    (r'^test/$','myview.displayName'),
)

Ao tomar a segunda abordagem, você pode simplesmente chamar o método sem o padrão de captura, e deixe python lidar com o parâmetro padrão ou você pode chamar uma visão diferente que delega.

Respondeu 24/10/2008 em 20:39
fonte usuário

votos
0

Eu pensei que podia def displayName(request, name=defaultObj); isso é o que eu fiz no passado, pelo menos. O que você estava definindo o valor padrão para?

Respondeu 24/10/2008 em 19:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more