web-dev-qa-db-de.com

Der "next" -Parameter leitet um, Django.contrib.auth.login

Ich versuche Benutzer nach der erfolgreichen Anmeldung an die benutzerdefinierte URL "/gallery/(username)/" umzuleiten. Derzeit wird auf die Standard-"/account/profile/"-URL umgeleitet. Obwohl ich weiß, was ich die Weiterleitungs-URL in meinem settings.py überschreiben kann, ist meine URL dynamisch und funktioniert daher nicht.

Die Dokumentation besagt, dass ich den "next"-Parameter und context processors. verwenden muss. Ich habe den {{next}} in meiner Vorlage, aber ich bin verwirrt, wie ich die "/gallery/(username)" tatsächlich übergeben kann. Jede Hilfe wäre sehr dankbar.

p.s: Ich versuche, mich vom Schreiben meiner eigenen Login-Ansicht zu distanzieren.

26
django-d

Ich gebe zu, dass ich normalerweise 2 Weiterleitungen verwende, um so etwas zum Laufen zu bringen.

Erstellen Sie zunächst Ihre eigene registration/login.html-Seite. Sie können das HTML-Beispiel in diesem Abschnitt der authentication docs kopieren und einfügen, um den Vorgang etwas zu vereinfachen. Anstatt die dynamische '{{ next }}-Variable aus dem Kontext zu verwenden, müssen Sie jedoch den Wert next festlegen, um zu einer generischen Landeansicht der angemeldeten Benutzer zu gelangen

<input type="submit" value="login" />
<input type="hidden" name="next" value="/gallery/" />

Extrahieren Sie dann in der Ansicht, die Sie der /gallery/-URL zuordnen, das Benutzerobjekt aus der Anforderung (da der Benutzer jetzt angemeldet ist, insbesondere wenn die Galerieansicht in einen @permission_required- oder @login_required-Dekorator eingeschlossen ist.) Verwenden Sie diese Ansicht, um zu umzuleiten die entsprechende benutzerspezifische Galerieseite:

@login_required
def gallery(request):
    url = '/gallery/%s/' % request.user.username
    return HttpResponseRedirect(url)
20
Jarret Hardie

Djangos Login-Ansicht Django.contrib.auth.views.login akzeptiert ein Wörterbuch mit dem Namen extra_context. Die Werte im Wörterbuch werden direkt an die Vorlage übergeben. Damit können Sie den Parameter next einstellen. Anschließend können Sie ein ausgeblendetes Feld mit dem Namen next und dem Wert {{ next }} so einstellen, dass es in der Vorlage gerendert wird.

39
Guruprasad

Wenn Sie bereits über eine benutzerdefinierte Vorlage für das Anmeldeformular verfügen, müssen Sie Folgendes in Ihr <form>-Tag einfügen:

<input type="hidden" name="next" value="{{next}}" />

Übrigens, Sie müssen keine eigene Login-Ansicht erstellen. Django.contrib.auth.views.login funktioniert einwandfrei. Sie müssen nur eine Vorlage dafür erstellen (registration/login.html)

7
Andrey Fedoseev

als Neuling bei Django und als ich über diesen etwas älteren Thread stolperte, fand ich eine abweichende Lösung für das Problem des dynamischen (= Überschreiben eines benutzerdefinierten Standardwerts nur, wenn nötig), indem ich den nächsten Parameter setze, den ich teilen möchte (funktioniert gut mit Django 1.5.) , frühere Versionen nicht getestet):

genau wie Django-d wollte ich Wiederholungen und eine benutzerdefinierte Login-Ansicht vermeiden, also habe ich die Aktienansicht Django.contrib.auth.views.login- verwendet, indem ich die Zeile von hinzugefügt habe

url(r'^login/$', 'Django.contrib.auth.views.login', {'template_name': 'myapp/login.html',}, name='login'),

zu meinem urls.py und innerhalb des login.html-templates Formularelements:

{% if not next or not next.strip %}
  {# avoid Django.contrib.auth.views.login s default of /account/profile/ #}
  {% url 'afterlogindefaultview' as next %}
{% endif %}
<input type="hidden" name="next" value="{{ next }}" />

was meines Erachtens folgt, ist die Entkopplungspraxis der URL-Konfigurationen aus den Ansichten. . Also für Ansichten, die sich zu meinen Apps umleiten müssen, melden Sie sich an und wechseln anschließend zu einer nicht standardmäßigen Ansicht , die ich verwende

return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext')) )

aus der ansicht, wo ich den benutzer haben möchte, um mich anzumelden. ich verwende dies, um zu der ansicht zurückzukehren, in der ich aufgehört habe, um den benutzer einzuloggen. 

5
antiplex

Sie können eine statische Weiterleitung zu /loggedin/ verwenden und dann die URL einer Ansicht zuordnen, die die richtige Weiterleitung vornimmt.

Die Anmeldung erfordert einen zusätzlichen Schritt, aber wenn Sie die Ansicht von Django verwenden möchten, wird die Arbeit erledigt.

2
naw

erstellen Sie eine eigene Ansicht für die Anmeldung. Verwenden Sie die eigene URL. Verwenden Sie nicht die Ansicht des Administrators. Sie können die nächste Seite in der Sitzung speichern oder als GET-Parameter an die Anmeldeansicht [.____. .] (dh/login? next = gallery) Vergessen Sie nicht, diesen Wert zu bereinigen und zu validieren, bevor Sie ihn weiterleiten.

0
ozk