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'
在此先感谢。
问题是你不能在'LOGIN_REDIRECT_URL'中有''这样的动态参数。您必须使用不带用户名的网址,然后使用用户名重定向到网址。看到我的答案[重复问题](http://stackoverflow.com/questions/36092760/django-login-and-redirect-to-user-profile-page)。 –
Alasdair
是为什么我得到404错误 –
如果你有'LOGIN_REDIRECT_URL ='/ accounts/home_page/ /''那么Django会尝试去那个确切的URL。它不会像您所期望的那样替换用户名,例如'/帐号/ home_page /伊曼纽尔/'。由于'[\ w - ] +'不接受'<' or '>',所以你会得到一个404. –
Alasdair