2014-09-01 142 views
1

我是Django的新手,我需要你的帮助。Django。登录后重定向用户

我在基于类的视图上构建我的应用程序。对于登录我使用默认django.contrib.auth.models.User类和一个一对一的关系为UserInfo类用于存储更多的信息(如个人资料照片等):

models.py

class UserInfo(models.Model): 
    user = models.OneToOneField(User) 
    birth_date = models.DateField() 
    avatar = models.FilePathField() 

后登录成功我想要将UserInfo数据传递给主页(定义为DetailView)。所以目前我有这样的事情:

urls.py

urlpatterns = patterns('', 
    url(r'^$',  Index.as_view(), name='index'), #Returns page with login form. 
    url(r'^login$', Index.as_view(), name='login'), #Proceed login form and redirects to homepage. 
    url(r'^home/id(?P<pk>\d+)$', login_required(Home.as_view(), login_url='/'), name='home'), 
) 

index.py

#Login proceed here 
class Index(generic.FormView): 
    template_name = 'index.html' 
    form_class = AuthenticationForm 
    success_url = '/home/id' 

    def post(self, request, *args, **kwargs): 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     user = authenticate(username = username, password = password) 
     if user is not None and user.is_active: 
      login(request, user) 
      return redirect('/home/id', pk = user.id) 
     else: 
      return redirect('/', {'error' : 'Incorrect login or password'}) 

home.py

class Home(generic.DetailView): 
    model = UserInfo 
    template_name = 'home.html' 

不幸的是它不起作用。你能帮我理解它应该如何工作吗? 而我应该如何获得UserInfo数据在我的home.html页面内?

回答

1

您不应该在URL重定向中传递数据,因为这本质上是安全的并且倾向于各种各样的利用(Content Spoofing vulnerability)。

相反,您应该通过使用Django sessions重定向传递数据。特别是在成功/错误消息的情况下,Django messages framework is handy

from django.contrib import messages 

def post(self, request, *args, **kwargs): 
    .... 
    else: 
     messages.error(request, "Incorrect username or password") 
     return redirect('/')