Nach der Anmeldung leitet Django standardmäßig den Benutzer auf eine Konten-/Profilseite um. Wenn Sie LOGIN_REDIRECT_URL bearbeiten, können Sie den Benutzer auf eine andere Seite senden, die Sie in der Datei settings.py angeben.
Das ist großartig, aber ich möchte, dass der Benutzer (nach dem Login) zu einer benutzerdefinierten Seite umgeleitet wird, auf der der Link zu dieser Seite in etwa so aussehen würde: mysite.com/username
. Das Standardkonto/Profil oder die LOGIN_REDIRECT_URL-Einstellungen würden in diesem Fall also nicht funktionieren, da beide statisch sind. In meinem Fall ändert sich der username
-Abschnitt der Adresse für jeden Benutzer.
Irgendwelche Ideen, wie ich es machen kann, wenn der Benutzer angemeldet ist, würden zu einer benutzerdefinierten Benutzerseite mit dem Benutzernamen in der Adresse gehen: mysite.com/username
? Jede Eingabe wird wirklich geschätzt.
Sie können den Benutzer wie folgt authentifizieren und anmelden: http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in
Dadurch erhalten Sie Zugriff auf das Benutzerobjekt, über das Sie den Benutzernamen abrufen und anschließend eine HttpResponseRedirect-Adresse für die benutzerdefinierte URL erstellen können.
Ein einfacherer Ansatz beruht auf der Umleitung von der Seite LOGIN_REDIRECT_URL . Der Schlüssel zum Erkennen ist, dass die Benutzerinformationen automatisch in die Anfrage aufgenommen werden.
Annehmen:
LOGIN_REDIRECT_URL = '/profiles/home'
und Sie haben ein URL-Muster konfiguriert:
(r'^profiles/home', home),
Alles, was Sie für die Ansicht home()
schreiben müssen, ist:
from Django.http import HttpResponseRedirect
from Django.core.urlresolvers import reverse
from Django.contrib.auth.decorators import login_required
@login_required
def home(request):
return HttpResponseRedirect(
reverse(NAME_OF_PROFILE_VIEW,
args=[request.user.username]))
dabei ist NAME_OF_PROFILE_VIEW
der Name des von Ihnen verwendeten Rückrufs. Bei Django-Profilen kann NAME_OF_PROFILE_VIEW
'profiles_profile_detail' sein.
Ja! Definieren Sie in Ihren Einstellungen.py Folgendes
LOGIN_REDIRECT_URL = '/your-path'
Und soll '/ your-path' eine einfache Ansicht sein, die self.request.user
nachschlägt und die Logik ausführt, die es zur Rückgabe eines HttpResponseRedirect
-Objekts benötigt.
Ein besserer Weg könnte sein, eine einfache URL wie '/simple'
zu definieren, die die Suchlogik dort ausführt. Die URL sieht schöner aus, erspart Ihnen etwas Arbeit usw.
Wenn Sie Djangos vordefinierte Variable LoginView
verwenden, ist next
als Kontext erforderlich. Dies ist "Die URL, zu der nach erfolgreicher login
weitergeleitet werden soll. Diese kann auch eine Abfragezeichenfolge enthalten." (siehe docs )
Auch aus den Dokumenten:
"Wenn die Anmeldung erfolgreich ist, wird die Ansicht an die in next
angegebene URL umgeleitet. Wenn next nicht angegeben ist, wird sie an settings.LOGIN_REDIRECT_URL
weitergeleitet (Standardeinstellung ist/accounts/profile /)."
Beispielcode:
urls.py
from Django.urls import path
from Django.contrib.auth import views as auth_views
from account.forms import LoginForm # optional form to pass to view
urlpatterns = [
...
# --------------- login url/view -------------------
path('account/login/', auth_views.LoginView.as_view(
template_name='login.html',
authentication_form=LoginForm,
extra_context={
# option 1: provide full path
'next': '/account/my_custom_url/',
# option 2: just provide the name of the url
# 'next': 'custom_url_name',
},
), name='login'),
...
]
login.html
...
<form method="post" action="{% url 'login' %}">
...
{# option 1 #}
<input type="hidden" name="next" value="{{ next }}">
{# option 2 #}
{# <input type="hidden" name="next" value="{% url next %}"> #}
</form>
Wenn Sie klassenbasierte Ansichten verwenden, können Sie auch die Versandmethode verwenden. https://docs.djangoproject.com/de/2.2/ref/class-based-views/base/
Beispiel Code:
Settings.py
LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'home'
urls.py
from Django.urls import path
from Django.contrib.auth import views as auth_views
urlpatterns = [
path('', HomeView.as_view(), name='home'),
path('login/', auth_views.LoginView.as_view(),name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
views.py
from Django.utils.decorators import method_decorator
from Django.contrib.auth.decorators import login_required
from Django.views.generic import View
from Django.shortcuts import redirect
@method_decorator([login_required], name='dispatch')
class HomeView(View):
model = models.User
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return redirect('login')
Elif some-logic:
return redirect('some-page') #needs defined as valid url
return super(HomeView, self).dispatch(request, *args, **kwargs)
Ich habe mich kürzlich mit Django beschäftigt und nach einer Lösung dafür gesucht und eine Methode gefunden, die nützlich sein könnte.
Wenn Sie beispielsweise allouth verwenden, lautet die Standardweiterleitung accounts/profile . Erstellen Sie eine Ansicht, die ausschließlich mithilfe des Benutzernamensfelds an einen Ort Ihrer Wahl weiterleitet:
def profile(request):
name=request.user.username
return redirect('-----choose where-----' + name + '/')
Erstellen Sie dann eine Ansicht, die diese in einer Ihrer Apps erfasst, zum Beispiel:
def profile(request, name):
user = get_object_or_404(User, username=name)
return render(request, 'myproject/user.html', {'profile': user})
Wo würde das Urlpatterns-Capture so aussehen:
url(r'^(?P<name>.+)/$', views.profile, name='user')
Funktioniert gut für mich.