2013-11-26 99 views
14

我想创建一个头部,并要求使用用户名/密码和登录按钮进行登录。目前,我如何设置我的页面是按下登录会将我发送到登录页面。我只想输入信息并按“登录”登录我的网站的主页。我如何设计我的urls.pyviews.py以在主页上执行登录?首页登录表单Django

我有一个base.html这是我的主页的模板。在模板中,我做了一个login.html局部视图:

<form action='/accounts/auth/' method='POST'> {% csrf_token %} 
    <div > 
     <label for='username'> Username </label> 
     <input type='text' name='Username' id='username'> 
     <label for='password'>Password </label> 
     <input type='password' name='Password' id='password'> 
     <input type='submit' value='login'> 
    </div> 
</form> 

我有点糊涂了action属性因为我不知道在哪里发送表单数据,如果我想授权在同一页面上登录。

我views.py

def login(request): 
    c = {} 
    c.update(csrf(request)) 
    return render(request, 'login.html', c) 


def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username = username, password = password)  

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect('/accounts/loggedin') 
    else: 
     return HttpResponseRedirect('/accounts/invalid') 

我不知道在哪里HttpResponseRedirect,以及如果记录中所有的主页上完成的。

也许我可以做一个render(request,SomePartialView.html)而不是HttpResponseRedirect

这里是我的urls.py:

url(r'^$', 'photoblog.views.login'), #displays login.html 
url(r'^accounts/auth/$', 'photoblog.views.auth_view'), #authorize login 

回答

6

我建议django-registration还是比较方便的。还有一个电子邮件验证。

你需要另外url说家:

url(r'^home/$', 'photoblog.views.home',name='home'), 
............. 

viewshome访问被限制为仅登录用户

from django.contrib.auth.decorators import login_required 
@login_required(login_url='/') #if not logged in redirect to/
def home(request):   
    return render(request, 'home.html') 

你不login.py

需要 csrf

ie:

def login(request): 
    return render(request, 'login.html') 

就足够了,因为render会通过csrf令牌。

from django.core.urlresolvers import reverse 
def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username = username, password = password)  

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect(reverse('home')) 
    else: 
     return HttpResponseRedirect('/accounts/invalid') 
12

如果你只是想有一个处理登录静态内容的主页,Django的内置身份验证的应用程序可以用很少的努力处理这个问题。你只需要绑定一个URL到django.contrib.auth.views.login,可能一个到django.contrib.auth.views.logout,写一个登录模板和一个注销后模板,然后设置一些设置变量。

完整的安装记录在这里: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views

下面是我的一个工作项目中的相关位:

urls.py: 
# HomeView is a simple TemplateView that displays post-login options 
urlpatterns = patterns('', 
    ... 
    url(r'^myapp/$', HomeView.as_view(template_name='home.html'), name='home'), 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'), 
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', name='logout'), 
    ... 
) 

settings.py: 
from django.core.urlresolvers import reverse_lazy 
... 
LOGIN_URL = reverse_lazy('login') 
LOGIN_REDIRECT_URL = reverse_lazy('home') 

templates/registration: 
login.html: 
{% extends "base.html" %} 
{% block head %} 
<title>Login</title> 
{% endblock %} 
{% block body %} 
{% if form.errors %} 
<p>Your username and password didn't match. Please try again.</p> 
{% endif %} 
<form method="post" action="{% url 'django.contrib.auth.views.login' %}"> 
{% csrf_token %} 
<table> 
<tr> 
    <td>{{ form.username.label_tag }}</td> 
    <td>{{ form.username }}</td> 
</tr> 
<tr> 
    <td>{{ form.password.label_tag }}</td> 
    <td>{{ form.password }}</td> 
</tr> 
</table> 
<input type="submit" value="login" /> 
<input type="hidden" name="next" value="{{ next }}" /> 
</form> 
{% endblock %} 

logged_out.html: 
{% extends "base.html" %} 
{% block head %} 
<title>Logged out</title> 
{% endblock %} 
{% block body %} 
<p>You have been logged out. You may <a href="{% url 'login' %}">log back in</a>.</p> 
{% endblock %} 

我不显示我的base.html模板,但我相信图案明显。如果你想要的不仅仅是一张纯粹的登录表单,那么没有理由让你的login.html模板变得更加有趣。这些名称是默认值,如视图所记录的,但如果您愿意,可以使用其他选项。

这就是你所需要的基本行为。如果您使用docs中描述的login_required修饰器来包装您的视图,那么只要未经过身份验证的用户尝试访问您的某个视图,它就会重定向到您的登录页面。或者,如果您使用的是基于课程的视图,请使用@method_decorator(login_required)作为记录here。从我的项目的两个片段:

from django.contrib.auth.decorators import login_required 
from django.utils.decorators import method_decorator 

class HomeView(TemplateView): 
    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(HomeView, self).dispatch(*args, **kwargs) 

@login_required 
def report_for_group(request, group_id): 
    ... 

的文档包括一些更复杂的设置的讨论,你需要他们。

+0

我试过之后你的意见,但我不断收到 “HomeView” 没有定义。我尝试导入到网址,但没有奏效。我错过了什么? –

+0

@MichelleGlauser - 导入应该是所有必要的。我可以从远处推荐的是检查错别字和不正确的路径。 –

+0

如何更改登录的默认模板位置?我没有看到在哪里放template_name – shenk

2

使用Django 1.11。 刚才我有同样的问题,这里是为我工作...

导入从内置的身份验证的应用程序,并通过template_name kwarg在你的模板文件传递登录视图类。

在urls.py:

from django.contrib.auth.views import LoginView 

app_name = 'yourapp' 
urlpatterns = [ 
    url(r'^$', LoginView.as_view(template_name='yourapp/index.html'), name="index"), 
] 

而且在你看来,你可以使用表单变量来渲染出你的表格。 在我的情况下,我使用bootstrap。

index.html中:

{% extends 'base.html' %} 
{% loads bootstrap %} 
{% block content %} 
    <form method="post" action="{% url 'login' %}"> 
     {% csrf_token %} 
     {% bootstrap_form form %} 
     {% bootstrap_button "Login" button_type="submit" button_class="btn-primary" %} 
     {# Assumes you setup the password_reset view in your URLconf #} 
     <p><a href="{% url 'password_reset' %}">Lost password?</a></p> 
    </form> 
{% endblock content %} 
+0

我想,你不能添加上下文。 – Daniel

+0

@Daniel,你可以尝试对LoginView进行子类化并重写'get_context_data'方法。 – Goran

0

我找到了解决办法。

第一,自定义登录和注销的观点:

views.py

def login_user(request): 
logout(request) 
username = password = '' 
form1 = RegistrationForm() 
if request.POST: 
    username = request.POST['username'] 
    password = request.POST['password'] 

    user = authenticate(username=username, password=password) 
    if user is not None: 
     login(request, user) 
     return redirect("redirect any whre u want") 

return render(request, 'Write login templaye address') 

def logout_user(request): 
    user = request.user 
    logout(request, user) 
    return redirect("redirect any whre u want") 

然后在你的base.html文件,你应该这样做:

base.html文件

<form method="post" action="/user/login/" novalidate> 
      {% csrf_token %} 


        <input class="form-control" id="id_username" name="username" placeholder="" 
          required="" type="text" 
          style=""> 
       </div> 
       <div class="form-group"> 

     <span class="material-icons" style="" 
     >lock</span> 
        <input class="form-control" id="password1" name="password" style="" autofocus="" 
          placeholder="" 
          required="" 
          type="password"> 
       </div> 

       <button class="btn btn-primary" type="submit" style=""></button> 
      </div> 


     </form> 

and login.html

<form method="post" action="/user/login/"> 
    {% csrf_token %} 
    <div class="form-group"> 
    <p> 
      <label for="id_username">username</label> 
      <input class="form-control" id="id_username" name="username" autofocus="" required="" type="text"> 
     </p> 
    <p> 
      <label for="id_password">password</label> 
      <input class="form-control" id="id_password" name="password" autofocus="" required="" type="password"> 
     </p> 
    <button type="submit">login</button> 
    </div> 
</form> 

urls.py

url(r'^login/$', views.login_user, name='login'), 
url(r'^logout/$', views.logout_user), 

其实你把投入在网页上,让他们到登录页面的输入错误处理好。

2

你可以使用Django的内建登录表单。它是简单而有效的,它会给你一些功能,如表单验证检查。

在urls.py:

url(r'^login/$',views.loginView,name='login'), 

的意见。潘岳:

from django.contrib.auth.views import login 
from django.contrib.auth.forms import AuthenticationForm 

def loginView(request): 
if request.method == 'POST': 
    form = AuthenticationForm(data=request.POST) 
    if form.is_valid(): 
     user = form.get_user() 
     login(request,user) 
     return redirect('/website/profile/') 
else: 
    form = AuthenticationForm() 
return render(request,'website/login.html',{'form':form}) 

在html页面:

<form method="post"> 
{% csrf_token %} 
{{form.as_p}} 
<p><input type="submit" value="Log in"></input></p>