Frage

Gibt es eine Möglichkeit einen Standardparameter auf eine Aktion im Fall bestanden haben, wo die Regex etwas mit django nur knapp sein Ziel überein?


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

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

Ich habe versucht, den dritten Parameter in dem urlpatterns zu einem Wörterbuch Einstellung enthält 'und den Namen Parameter einen Standardwert für das Verfahren zu geben, von denen keines gearbeitet. Der Parameter Name scheint immer keine zu sein. Ich habe nicht wirklich will, einen Scheck über keine codieren, wenn ich einen Standardwert einstellen könnte.

Zur Verdeutlichung:. Hier ist ein Beispiel dafür, was ich ändere es zu


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

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

, wenn ich meinen Browser in der Sicht zeigt es den Text 'Keine'

Irgendwelche Ideen?

War es hilfreich?

Lösung

Das Problem ist, dass, wenn das Muster gegen angepaßte ‚test /‘ groupdict die durch die regulären Ausdruck enthält die Abbildung erfasst ‚name‘ => Keine:

>>> url.match("test/").groupdict()
{'name': None}

Das bedeutet, dass, wenn die Ansicht aufgerufen wird, mit etwas, was ich erwarte, dass auf unter ähnelt:

view(request, *groups, **groupdict)

das ist äquivalent zu:

view(request, name = None)

'test /', was bedeutet, dass Name None zugeordnet ist und nicht nicht zugeordnet.

Dies läßt Sie mit zwei Optionen. Sie können:

  1. Explizit überprüft Keine in der Ansicht Code, welche Art von hackish ist.
  2. die URL Abfertigungsrichtlinie Umschreiben der Name capture nicht optional und die Einführung einer zweiten Regel zu erfassen zu machen, wenn kein Name angegeben wird.

Zum Beispiel:

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

Wenn der zweite Ansatz, können Sie einfach die Methode aufrufen, ohne das Capture-Muster, und lassen Python die Standard-Parameter behandeln, oder Sie können eine andere Ansicht, die Delegierten nennen.

Andere Tipps

I dachte Sie könnten def displayName(request, name=defaultObj); das ist, was ich in der Vergangenheit getan haben, zumindest. Was haben Sie den Standardwert einstellen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top