سؤال

أحاول إعادة توجيه المستخدم إلى عنوان url يحتوي على اسم المستخدم (مثل http://domain/username/) ، في محاولة لمعرفة كيفية القيام بذلك.أنا باستخدام جانغو.contrib.المصادقة على المستخدم إدارة, حتى لقد حاولت استخدام LOGIN_REDIRECT_URL في الإعدادات:

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail..

ولكن يبدو فقط إلى قبول ثابت سلاسل, بدلا من أن شيئا سوف يتحدد بعد تسجيل مستخدم.كيف يمكنني تحقيق ذلك ؟

هل كانت مفيدة؟

المحلول

والحل، هو توجيه لمسار ثابت مثل '/ userpage /' ولها أن إعادة توجيه إلى صفحة ديناميكية النهائية.

ولكن أعتقد أن الحل الحقيقي هو جعل طريقة عرض جديدة أن يفعل ما تريد حقا.

from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            HttpResponseRedirect('/%s/'%username) 
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

http://docs.djangoproject.com / EN / ديف / المواضيع / المصادقة / # التوثيق في وطلبات الويب

لمزيد من المعلومات حول إعادة كتابة الرأي. هذه هي الطريقة التي تقول مستندات لتجاوز هذا النوع من الشيء.

نصائح أخرى

والتفاف الرأي المصادقة في ضوء المخصص الخاص بك وإعادة توجيه إلى أي مكان تريد إذا نجحت المصادقة.

from django.http import HttpResponseRedirect
from django.contrib import auth
from django.core.urlresolvers import reverse

def login(request):
    template_response = auth.views.login(request)

    if isinstance(template_response, HttpResponseRedirect) and template_response.url == '/accounts/profile/':
        return HttpResponseRedirect(reverse('user', args=(request.user.username,)))


    return template_response

وثمة بديل آخر هو استخدام next المعلمة الاستعلام للإشارة إلى حيث لإعادة توجيه إلى بعد تسجيل الدخول.

<a href="{% url 'login' %}?next={{ request.path }}">sign in</a>

مع على أساس طبقي django.contrib.auth.views.LoginView, يمكنك الآن ببساطة تجاوز get_success_url:

urls.py:

url(r'^login$', MyLoginView.as_view(), name='login'),
url(r'^users/(?P<username>[a-zA-Z0-9]+)$', MyAccountView.as_view(), name='my_account'),

views.py

class MyLoginView(LoginView):

    def get_success_url(self):
        return reverse('my_account', args=[self.request.user.username])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top