0

Django的1.10 的Python 3.5.3Django的CBV登录并重定向用户的个人资料页:传递一个用户名LOGIN_REDIRECT_URL

使用CBV,我能够让用户登录到该网站。但是,我无法让用户在登录后重定向到他们的个人资料。我想让他们在登录后转到此页面: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-]+)/$'] 

如何传递用户名的网址是什么?

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'中有''这样的动态参数。您必须使用不带用户名的网址,然后使用用户名重定向到网址。看到我的答案[重复问题](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 /伊曼纽尔/'。由于'[\ w - ] +'不接受'<' or '>',所以你会得到一个404. – Alasdair

相关问题