2011-10-27 79 views
0

我有一個簡單註冊表單(在signup.html)註冊然後登錄一個用戶使用Django

<form action="adduser" method="post"> 
{% csrf_token %} 
    Email Address: <input type="email" name="email" required autocomplete="on" placeholder="[email protected]"/><br/> 
    Username: <input type="text" name="username" maxlength=25 required placeholder="JoyfulSophia"/><br/> 
    Password: <input type="password" name="password" maxlength=30 required placeholder="**********" /><br/> 
    <br/> 
    <input type="submit" value="Send" /> <input type="reset"> 
</form> 

這重定向到ADDUSER視圖:

def adduser(request): 
    u = User.objects.create_user(request.POST['username'], request.POST['email'], password=request.POST['password']) 
    u.save() 
    a = Accounts(user=u) 
    p = Passwords(user=u) 
    a.save() 
    p.save() 
    return HttpResponseRedirect(reverse('OmniCloud_App.views.profile', args=(u.id,))) 

這裏是配置文件:

@login_required  
def profile(request, User_id): 
    u = get_object_or_404(User, pk=User_id) 
    a = get_object_or_404(Accounts, pk=User_id) 
    return render_to_response('profile.html', context_instance=RequestContext(request)) 

所以他們不會登錄,但沒關係,因爲我們可以發送給/ accounts/login?next =/7 /因爲他們是用戶7(Probl EMS進取!)

def login(request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = auth.authenticate(username=username, password=password) 
    if user is not None and user.is_active: 
     auth.login(request, user) 
     return HttpResponseRedirect("/account/profile/") 
    else: 
     return HttpResponseRedirect("/account/invalid/") 

不包含任何用戶名叫做請求,但已提交ADDUSER形式呢,所以我怎麼能過即拍即兄弟登錄的人嗎?我可以讓它解析url(其中包含next = USER_ID),但對於只輸入base_url/login的用戶不起作用,並且user_id永遠不會成爲url的一部分。那麼,兄弟該做什麼?

回答

3

發佈數據僅針對一個請求。如果你想稍後使用它,你應該將它保存在別的地方。

您可以在註冊後登錄用戶,在adduser視圖中,他只需輸入他的用戶名和密碼,他不必再次重複。

和登錄視圖有點關閉。這只是視圖的「POST」部分。您需要檢查並查看它是否是GET請求,以及它是否返回包含usernamepassword字段以及指向相同視圖的目標網址的表單。事情是這樣的:

def login(request): 
    if request.method == 'GET': 
     return render_to_response('login.html', 
            { 'form': LoginForm() }, 
            context_instance=RequestContext(request)) 
    elif request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      user = auth.authenticate(username=username, password=password) 
      if user is not None and user.is_active: 
       auth.login(request, user) 
       return HttpResponseRedirect("/account/profile") 
      else: 
       return HttpResponseRedirect("/account/invalid/") 

哪裏login.html是這樣的:

{% extends "base_site.html" %} 

{% block content %} 
    <form method="post" target="{% url login_view %}"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Login" /> 
    </form> 
{% endblock content %} 

此外,您還可以返回用戶相同的登錄表單,如果用戶名和密碼不匹配,並添加一些消息!

這只是從我的頭頂,沒有嘗試它,但它應該工作!

+0

這是一個美妙的答案,非常感謝! – Chris

+0

我已經有了一個login.html,所以我需要包含{form,LoginForm()... etc? – Chris

+0

沒有必要擁有LoginForm,你可以自己鍵入html,然後從request.POST中提取數據,但我會建議使用它。我也會使用一個註冊,它可以讓事情變得更容易。另外,如果你創建了一個,你將不得不導入它。根據我在答案中寫的觀點,可以在模板中以「form」的形式提供,但你可以改變它。 –

0

Django有一個可擴展的用戶註冊應用程序,名爲django-registration,它爲您提供了許多用於創建和註冊用戶的功能。設置它非常簡單,你可以找到一個非常好的文檔here

相關問題