0

Джанго 1,10 Python 3.5.3Джанго ОЦК Войти и перенаправить пользователя на страницу профиля: передавая имя пользователя LOGIN_REDIRECT_URL

Используя ОЦК, я могу войти пользователя на сайт. Однако я не могу заставить пользователя перенаправлять свой профиль после входа в систему. Я хочу, чтобы они зашли на эту страницу после входа в систему: https://example.com/profiles/user. Вместо этого, я получаю эту ошибку:

NoReverseMatch at /accounts/login/ 
Reverse for 'profile' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['profile/(?P<slug>[\\w-]+)/$'] 

Как я могу передать имя пользователя в URL?

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 
    username = models.CharField(max_length=30, 
           unique = True, 
           default='') 
    email = models.EmailField(default='', 
           unique = True, 
           max_length=100) 
    profile_image = models.ForeignKey(Image, null=True) 
    slug = models.SlugField(default='') 
    is_active = models.BooleanField(default=True) 
    is_authenticated = models.BooleanField(default=True) 
    is_anonymous = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['name'] 

    @receiver(post_save, sender=User) 
    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      Profile.objects.create(user=instance) 

    @receiver(post_save, sender=User) 
    def save_user_profile(sender, instance, **kwargs): 
     instance.profile.save() 

    def next_birthday(born): 
     today = date.today() 

     return today.year - born.year - ((today.month, today.day) < (born.month, born.day)) 

    def get_absolute_url(self): 
     return reverse('profiles:profile', kwargs={'slug': self.slug}) 

    def __str__(self): 
     return self.username 

views.py

class LoginView(FormView): 

    template_name = 'registration/login.html' 

    """ 
    Provides the ability to login as a user with a username and password 
    """ 
    success_url = 'profile/<slug>' 
    form_class = AuthenticationForm 
    redirect_field_name = REDIRECT_FIELD_NAME 

    @method_decorator(sensitive_post_parameters('password')) 
    @method_decorator(csrf_protect) 
    @method_decorator(never_cache) 

    def dispatch(self, request, *args, **kwargs): 
     # Sets a test cookie to make sure the user has cookies enabled 
     request.session.set_test_cookie() 

     return super(LoginView, self).dispatch(request, *args, **kwargs) 

    def form_valid(self, form): 
     auth_login(self.request, form.get_user()) 

     # If the test cookie worked, go ahead and 
     # delete it since its no longer needed 
     if self.request.session.test_cookie_worked(): 
      self.request.session.delete_test_cookie() 

     return super(LoginView, self).form_valid(form) 

    def get_success_url(self): 
     redirect_to = self.request.GET.get(self.redirect_field_name) 
     if not is_safe_url(url=redirect_to, host=self.request.get_host()): 
      redirect_to = self.success_url 

     return redirect_to 

urls.py

urlpatterns = [ 
    url(r'^(?P<slug>[\w-]+)/$', 
     ProfileView.as_view(), 
     name = 'profile'), 

settings.py

LOGIN_REDIRECT_URL = 'profiles:profile' 

Заранее спасибо.

ответ

1

Попробуйте использовать это в:

settings.py

LOGIN_REDIRECT_URL = '/accounts/home_page/<username>/' 

urls.py

from .views import * 
from . import views 
from django.conf import settings 
from django.conf.urls import url 

urlpatterns = [ 
    url(r'^accounts/home_page/(?P<username>[\w-]+)/$', UserProfileView.as_view(), name='user_profile_view'), 
] 

просмотры

class UserProfileView(View): 
    @method_decorator(login_required) 
    def get(self, request, username): 
     if request.user.username == username: 
      profile = get_object_or_404(User, user=request.user) 
      return render(request, 'registration/home.html', {'profile': profile}) 
     else: 
      raise Http404 

ВНИМАНИЕ: Это может дать вам 404 если они не являются временной страницей для t он пользователь, я все еще работаю над этим ...

+0

Проблема заключается в том, что у вас не может быть динамический параметр, например '' в 'LOGIN_REDIRECT_URL'. Вы должны использовать URL-адрес без имени пользователя, а затем перенаправить на URL-адрес с именем пользователя. См. Мой ответ на [дублированный вопрос] (http://stackoverflow.com/questions/36092760/django-login-and-redirect-to-user-profile-page). – Alasdair

+0

вот почему я получаю ошибку 404 –

+0

Если у вас есть 'LOGIN_REDIRECT_URL = '/ accounts/home_page/ /'', то Django попытается перейти к этому точному URL-адресу. Он не будет заменять имя пользователя, как вы могли ожидать, например. '/ Счета/home_page/Emmanuel /'. Поскольку '[\ w -] +' не принимает '<' or '>', вы получите 404. – Alasdair

Смежные вопросы