主页登录表单Django

Lio*_*cer 20 html python django login

我想创建一个带有标题的主页,要求使用用户名/密码登录并使用登录按钮登录.目前,我如何设置我的页面是按下登录将我发送到登录页面.我想简单地输入信息并按"登录"登录我网站的主页.如何在主页上设计我的urls.pyviews.py登录?

我有一个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>
Run Code Online (Sandbox Code Playgroud)

我对该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')
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Pet*_*per 14

如果您只想拥有一个处理登录的静态内容的主页,Django内置的auth应用程序可以轻松处理这个问题.您只需要将URL绑定到一个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

以下是我的工作项目的相关部分:

# 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'),
    ...
)
Run Code Online (Sandbox Code Playgroud)

我没有展示我的urls.py模板,但我相信这种模式很明显.如果您想要的不仅仅是一张裸登录表单,那么您的settings.py模板就没有理由变得更加漂亮.名称是默认值,如视图所述,但如果您愿意,可以使用其他选项.

这就是基本行为所需要的一切.如果您login.html按照文档中的描述使用装饰器包装视图,则只要未经过身份验证的用户尝试访问您的某个视图,它就会重定向到您的登录页面.或者,如果您使用的是基于类的视图,请logged_out.html按照此处的说明进行操作.我的项目还有两个片段:

from django.core.urlresolvers import reverse_lazy
...
LOGIN_URL = reverse_lazy('login')
LOGIN_REDIRECT_URL = reverse_lazy('home')
Run Code Online (Sandbox Code Playgroud)

如果您需要,文档包括讨论一些更复杂的设置.


suh*_*lvs 6

我建议django-registration这很容易.还有一个电子邮件验证.

你需要一个额外的url说法:

url(r'^home/$', 'photoblog.views.home',name='home'),
.............
Run Code Online (Sandbox Code Playgroud)

views,home访问被限制为只有登录用户

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')
Run Code Online (Sandbox Code Playgroud)

你不需要csrflogin.py

即:

def login(request):
    return render(request, 'login.html')
Run Code Online (Sandbox Code Playgroud)

就足够了,因为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')
Run Code Online (Sandbox Code Playgroud)


Md.*_*han 5

您可以使用 Django 的内置登录表单。它非常简单和高效。它会给你一些功能,比如表单验证检查。

在 urls.py 中:

url(r'^login/$',views.loginView,name='login'),  
Run Code Online (Sandbox Code Playgroud)

在views.py中:

from django.contrib.auth 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})
Run Code Online (Sandbox Code Playgroud)

在 html 页面中:

<form method="post">
{% csrf_token %}
{{form.as_p}}
<p><input type="submit" value="Log in"></input></p>
Run Code Online (Sandbox Code Playgroud)