web-dev-qa-db-de.com

Django - leiten Sie den Benutzer nach der Anmeldung auf seine benutzerdefinierte Seite -> mysite.com/username

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. 

30
avatar

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.

6
Abid A

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.

65
Stu

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.

4
Jarvis Jones

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>
2
kimbo

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)
2
Cliff Robbins

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.

0
mromanda