Frage Reverse für 'password_change_done' mit Argumenten '()' und Schlüsselwortargumenten '{}' nicht gefunden


Hintergrund

Ich versuche, die Authentifizierungsansichten in einem Django-Projekt anzupassen, aber ich kann nicht scheinen, dass die angepasste password_change-Ansicht ausgeführt wird. Ich benutze Django 1.8.2 und Python 2.7.

Das urls.py meines Moduls userauth sieht wie folgt aus:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('django.contrib.auth.views',
    url(r'^login/$', 'login', {'template_name': 'userauth/login.html'},
        name='userauth_login'),
    url(r'^logout/$', 'logout', {'next_page': '/'},
        name='userauth_logout'),
    url(r'^password-change/$', 'password_change',
        {'template_name': 'userauth/password_change_form.html'},
        name='userauth_password_change'),
    url(r'^password-change-done/$', 'password_change_done',
        {'template_name': 'userauth/password_change_done.html'},
        name='userauth_password_change_done'),
)

Dies wird hauptsächlich referenziert urls.py als das:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^account/', include('userauth.urls')),
]

Die Vorlage von meinem userauth/password_change_form.html

{% extends "base.html" %}

{% block title %}{{ block.super }} - Change Password{% endblock %}

{% block toggle_login %}{% endblock %}

{% block content %}
<form action="{% url 'userauth_password_change' %}" method="post" accept-charset="utf-8">
  {{ form.as_p }}
  {% csrf_token %}
  <input type="submit" value="Change password"/>
</form>
{% endblock %}

Und die Vorlage für userauth/password_change_done.html

{% extends "base.html" %}

{% block title %}{{ block.super }} - Password change successful{% endblock %}

{% block content %}
<p>Your password has been changed successfully.</p>
<a href="{% url 'products_product_index' %}">Back to your Account</a>
{% endblock %}

Das Problem

Wenn ich das öffne 'password_change_done' Seite (at / account / password-change-done), dann ist alles in Ordnung.

Aber bei 'password-change' (/ accunt / password-change) Ich erhalte diesen Fehler:

NoReverseMatch unter / account / password-change /

Reverse für 'password_change_done' mit Argumenten '()' und Schlüsselwortargumenten '{}' nicht gefunden. 0 Muster versucht (en): []

Was ich versucht habe

Ich habe keine Ahnung, warum das passieren sollte.

  1. Ich habe versucht, die einzelnen Zitate zu entfernen url 'userauth_password_change'
  2. Ich habe sichergestellt, dass password-change-doneSeite existiert in urls.py und ist verfügbar
  3. Ich lese die Lösungen bei Reverse für '*' mit Argumenten '()' und Schlüsselwortargumente '{}' nicht gefunden, Django: Reverse für 'Details' mit Argumenten '(' ',)' und Schlüsselwortargumente '{}' nicht gefunden, Django change_password NoReverseMatch unter / accounts / password / change / (und ein paar mehr, ich habe alle Lösungen dort versucht, aber ich kann kein Problem in meinem eigenen Code finden)

Jede Hilfe wird geschätzt. Vielen Dank!


5
2018-06-13 17:16


Ursprung


Antworten:


Ok, also die vorgeschlagene Lösung für mich hat hier nicht funktioniert. Ich verwende Django 1.8.8 in einer Anwendung mit einer bestimmten App-Bezeichnung, daher muss ich eine URL in einer Vorlage wie dieser angeben, z. app_label: URL_Name. Dies bedeutet, dass das Umgekehrte für password_change_done nie funktionieren würde, da es app_label ist: password_change_done.

Aber glücklicherweise gibt es eine Lösung: 'post_change_redirect'. Daher habe ich password_change wie folgt angegeben:

url(r'^password_change$', 'django.contrib.auth.views.password_change', {'template_name': 'password_change.html', 'post_change_redirect': 'app_label:password_change_done'}, name='password_change'),

Ich bin mir sicher, dass andere dies verwenden können, um das oben genannte Problem zu lösen und trotzdem ihren eigenen benutzerdefinierten URL-Namen beizubehalten.


5
2017-07-03 14:19



In einem Abschnitt rufen Sie die URL namens "password_change_done" auf

Der korrekte Name ist: "userauth_password_change_done"


3
2018-06-13 17:20



Die Lösung war, dass in der urls.py der Name des password_change_done Links steht Muss Sein 'password_change_done':

url(r'^password-change-done/$', 'password_change_done',
    {'template_name': 'userauth/password_change_done.html'},
    name='password_change_done'),

Ich habe es mir angeschaut django.contrib.auth.views.password_change (was das Problem verursacht) und erkannte, dass die URL 'password_change_done' ist in Django 1.8.2 fest codiert.


3
2018-06-14 16:47



Sie müssen einfache Anführungszeichen um den Namen der Ansicht löschen

{% url password_change_done%} Anstatt von

{% url 'password_change_done'%}


1
2018-04-27 17:45