2011-10-27 48 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

相关问题