2017-07-18 3 views
0

Ich bekomme einen NoReverseMatch-Fehler, wenn ich versuche, zwei Argumente von einer Ansicht zur anderen zu übergeben. Hier ist die Ansicht, die die Argumente übergibt:Django kann nicht repariert werden NoReverseMatch-Fehler

# promotion/views.py 
def enter_promo_code(request, template): 
    if request.method == "POST": 
     form = PromotionCodeForm(request.POST) 
     if form.is_valid(): 
      message_text, expiry_date = process_valid_promo_code(request.user, form.cleaned_data['promo_code']) 
      return HttpResponseRedirect(reverse('welcome-page-promo', \ 
        kwargs={'message_text': message_text, 'expiry_date': expiry_date})) 
    else: 
     form = PromotionCodeForm(label_suffix="") 
    context = {'form': form} 
    return render(request, template, context) 

Hier ist die Empfangsansicht. Beachten Sie, dass die beiden Eingabeargumente optional sind. Die URL-Muster zeigen, dass diese Ansicht mit oder ohne Argumente aufgerufen werden kann.

# home/views.py 
def welcome_page(request, template, message_text=None, expiry_date=None): 
    account = Account.objects.get(pk=request.user.id) 
    context = {'uid': request.user.id, 'account_type': account.type.account_type_cd, 'message_text': message_text, 'expiry_date': expiry_date} 
    return render(request, template, context) 

Hier sind die urlpatterns für die Empfangsansicht:

# home/urls.py 
url(r'^welcome/$', 
    'home.views.welcome_page', 
    {'template': 'welcome_page.html'}, 
    name='welcome-page'), 

url(r'^welcome/(?P<message_text>\w{1,})/(?P<expiry_date>\w{1,})/$', 
    'home.views.welcome_page', 
    {'template': 'welcome_page.html'}, 
    name='welcome-page-promo'), 

Wenn ich die Förderung Ansicht ausführen, bekomme ich diesen Fehler, wenn die Rück HttpResponseRedirect Befehl ausführt:

NoReverseMatch at /promotion/code/ 
Reverse for 'welcome-page-promo' with arguments '()' and keyword arguments '{'message_text': u'Your promotion code was approved! You will receive a one-year free trial membership which expires on ', 'expiry_date': 'Jul. 18, 2018'}' not found. 1 pattern(s) tried: ['welcome/(?P<message_text>\\w{1,})/(?P<expiry_date>\\w{1,})/$'] 

I‘ m läuft das gleiche Codemuster in einer anderen Anwendung im Projekt und es läuft ohne Fehler. Kann jemand sehen, was ich falsch mache?

+0

Warum haben Sie den vollständigen Nachrichtentext in der URL? – Sayse

+1

Ja, jetzt, wo ich es ansehe, was ich versucht habe, war ziemlich dumm. – William

Antwort

0

Sie haben hier zwei Probleme, eines des Designs und eines der Implementierung.

Das Design-Problem ist, dass Sie wahrscheinlich nicht so lange Text in Ihren URLs haben sollten. Ich glaube, Django wird mit dem Argument umgehen, dass es für dich entgeht, aber es wird immer noch nicht das einfachste Muster sein, mit dem man arbeiten kann. Es sieht für mich so aus, als wäre Ihr message_text Argument wahrscheinlich statisch oder zumindest aus einer kleinen Anzahl von Möglichkeiten ausgewählt. Höchstwahrscheinlich sollten Sie es in Ihrer Vorlage aufzeichnen, ein Modell dafür erstellen und die ID oder etwas in dieser Richtung weitergeben. Es ist nichts falsch daran, Daten in einem URI zu übergeben, obwohl ich ein einfacheres Format wie 2018-07-18 über Jul. 18, 2018 bevorzuge, aber wenn es wirklich ein Ablaufdatum ist, möchtest du wahrscheinlich ein Modell für Mitgliedschaften haben und es dort als Attribut setzen, dann schau es nach Es ist Ihre Begrüßungsseite.

Putting der beiseite und betrachten Sie Ihre Implementierung Problem - Ihre Ansicht regexps nur von der \w Klasse eines oder mehr Zeichen übereinstimmen, die definiert ist als:

Wenn die LOCALE und UNICODE-Flags werden nicht angegeben ist, übereinstimmt jedes alphanumerische Zeichen und der Unterstrich; Dies entspricht der Menge [a-zA-Z0-9_]. Mit LOCALE wird es mit der Menge [0-9_] plus allen Zeichen übereinstimmen, die für das aktuelle Gebietsschema als alphanumerisch definiert sind. Wenn UNICODE festgelegt ist, entspricht dies den Zeichen [0-9_] plus allem, was in der Unicode-Eigenschaftendatenbank als alphanumerisch klassifiziert ist.

Ihre Argumente enthalten jedoch Zeichen wie ! und Leerzeichen. Verwenden Sie eine Regexp, die Ihren gewünschten Argumenten entspricht - [^/]+ ist eins, wenn Sie verzeihen wollen. (+ ist besser lesbar als {1,} meiner Meinung nach, aber sie bedeuten die gleiche Sache.)

+0

Danke. Es hätte eine Weile gedauert, bevor ich das herausgefunden hätte, wenn überhaupt. Aber wie Sayse oben angedeutet hat, was ich zuerst versucht habe, was dumm zu machen. Das ist keine Frage, auf die ich stolz bin. – William

Verwandte Themen