2014-02-23 39 views
2

我想在登錄後重定向主頁,但request.user始終是匿名的。錯誤在哪裏隱藏?Django登錄後爲什麼request.user始終是匿名的?

的代碼: urls.py

urlpatterns = patterns('', 
     url(r'^login/$', login_view), 
     url(r'^main/$', main_view,name='main'), 
    ) 

我點名forms.py

class LoginForm(forms.Form): 
    username = forms.CharField(required=True, 
      label='', 
      max_length=12, 
      error_messages={'required':'username'}, 
      widget=forms.TextInput(
       attrs={'placeholder':'username', 
         'class':'form-control'})) 
    password = forms.CharField(required=True, 
      label='', 
      max_length=12, 
      min_length=6, 
      error_messages={'required':'password'}, 
      widget=forms.PasswordInput(
       attrs={'placeholder':'password', 
         'class':'form-control'})) 

    def clean(self): 
     if not self.is_valid(): 
      raise forms.ValidationError('username and password are required') 
     else: 
      cleaned_data = super().clean() 

一個登錄表單視圖文件:

def login_view(request): 
    if request.method == 'GET': 
     form = LoginForm(auto_id=False) 
     return render_to_response('game/login.html', 
       RequestContext(request, {'form': form,})) 
    else: 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = request.POST.get('username', '') 
      password = request.POST.get('password', '') 
      user = auth.authenticate(username=username, 
            password=password) 
      if user is not None and user.is_active: 
       auth.login(request, user) 
       return render_to_response('game/main.html', 
         context_instance=RequestContext(request)) 
      else: 
       return render_to_response('game/login.html', 
        RequestContext(request, 
         {'form': form,'password_is_wrong':True})) 
     else: 
      return render_to_response('weapon/login.html', 
        RequestContext(request, {'form': form,})) 

@login_required(login_url='/game/login/') 
def main_view(request): 
    user = request.user 
    return render_to_response('weapon/main.html', 
        {'user':user}, 
        context_instance=RequestContext(request)) 

登錄.html含UDE:

<form class="form-signin" role="form" action="{% url 'game:main' %}" method="post"> 
     {% csrf_token %} 

     <h2 class="form-signin-heading">Login in</h2> 
     {{ form.as_p }} 
     <label class="checkbox"> 
      <input type="checkbox" value="remember-me"> remember me 
     </label> 
     <button class="btn btn-lg btn-primary btn-block" type="submit">Login</button> 
     </form> 

main.html中包括:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
{% if user.is_authenticated %} 
    {{ user.username }} Successful 
{% else %} 
    failed 
{% endif %} 
</body> 
</html> 

任何建議,將不勝感激。

+0

其實我有同樣的問題,並û搞清楚? – levi

回答

0

登錄後,您將用戶重定向到game/main.html,而在我看來,您應該將用戶重定向到main_view

views.py的代碼塊應該是: -

編輯:

if user is not None and user.is_active: 
    auth.login(request, user) 
    return HttpResponseRedirect('/game/main') 
+0

編輯了我的回覆,請嘗試使用HttpResponseRedirect。 – anuragal

+0

如果我寫下面並像以前一樣寫login_view,它可以在沒有login_required的情況下工作,如果我添加了login_required,它現在不能工作:def main_view(request): username = request.POST ['username'] user = User.objects.get(username = username) return render_to_response('game/main.html', {'user':user}, context_instance = RequestContext(request)) – user3342521

+0

我再次嘗試過,仍然失敗。 – user3342521

0

在您的登錄模板的形式指向主視圖action="{% url 'game:main' %}"沒有登錄視圖,表單永遠不會被處理。

你應該把它指向相同的登錄視圖來處理身份驗證,只需使用action="."也保持在相同的URL登錄視圖或具體使用您正在使用已經與主要的相同的技術,即

點吧
urlpatterns = patterns('', 
    url(r'^login/$', login_view, name='login'), 
    url(r'^main/$', main_view, name='main'), 
) 

而且在你的模板:

action="{% url 'game:login' %}"