django使用表单引发的错误

一.在一般的网站开发过程中都会用到表单,而在django的模板文件中都会用到<form>标签,我现在做的是一个博客系统,现在已经做好了文章展示界面。如图所示。

   

二.现在我们要做的是一个用户登录界面,我们使用django内置的User类来创造用户对象 代码如下,我们的用户仅定义了用户名和密码。

from django import forms
from django.contrib.auth.models import User
class UserLoginForm(forms.Form):
    username=forms.CharField()
    password=forms.CharField()
知识兔

三.接下来就是我们的视图函数了,代码如下,代码相信大家还是都可以看懂

from .forms import UserLoginForm
# Create your views here.
def user_login(request):
    if request.method=='POST':# 请求方法为post
        user_login_form=UserLoginForm(data=request.POST)#以post请求的数据填充表单
        if user_login_form.is_valid():#扁担数据有效
            username=request.POST['username']
            password=request.POST['password']#获取用户名及密码
            user=authenticate(username=username,password=password)#查询是否存在这个用户,有则返回用户对象
            if user:#用户存在
                login(request,user)#用户登录并保持session
                return redirect(reverse('articles:article'))#重定向到文章展示界面
            else:
                return HttpResponse('账号或密码有误,请重新填写')#用户不存在
        else:
            return HttpResponse('表单格式填写错误,请重新填写')#表单格式错误
    elif request.method=='GET':#请求方法为get
        user_login_form=UserLoginForm()#创建空的表单以供用户输入
        context={'form':user_login_form}
        return render(request,'userprofile/login.html',context)
    else:
        return HttpResponse('请使用get或post请求获取数据')
知识兔

 四.接下来就是我们的模板文件的编写了,我出错也是在这个地方,也是查阅了很久才明白其中的原理,代码看起来没什么特别难得地方,但是不一定每一个学习django的人都能完完全全明白这段代码。首先我们看<form method="post" action="{% url 'login:userlogin' %}">,起初我做这个博客系统是跟着网上的一个教程来的< form method="post" action=".">,那接下来当我们在地址栏输入登录界面的url--http://localhost:8000/login/登录并填入正确的用户名及数据之后会有什么结果呢(看图)看到没有,直接弹出一个404错误,那么我们将代码改成<form method="post" action="{% url 'articles:article' %}">({% url 'articles:article' %}代表的是文章展示界面的url)那结果如何呢(看图)

{% extends 'articles/base.html' %}{% load staticfiles %}
{% block title %}登录{% endblock title %}
{% block content %}
<div class="container">
    <div class="row">
        <div class="col-12">
            <br>
            <form method="post" action="{% url 'login:userlogin' %}">
                {% csrf_token %}
                {{form.as_p}}
                <button type="submit" class="btn btn-primary">提交</button>
                <input type="hidden" name="next" value="{% url 'articles:article' %}"/>
            </form>
        </div>
    </div>
</div>
{% endblock content %}
知识兔

  看到这里大家似乎认为已经成功了,但我要告诉大家其实这里并没有成功。我也是多方查阅资料才知道的,没办法对前端知识不是很了解。在这里我要告诉大家当 button type='submit'时,当你填写完表单时浏览器将自动跳转到action所代表的地址,也就是说表单数据会被提交到action所指的地址,并且浏览器也将会跳转到那个地址,也就说当你的action={% url ‘articles:article’ %}时,我们所编写的视图函数中处理post请求的那一部分根本没有用,因为我们根本没有用post方法来访问登录界面。

那么到这里情况似乎就清楚了,当我们在地址栏输入http://localhost:8000/login/登录时,此时我们是以get方法请求这个页面,那么我们将得到一个空的表单让我们填写,若我们的action={% url 'login:userlogin' %}的话那我们填充完表单后数据将会被提交到登录界面,而且此时我们是以post方法访问登录界面,为什么呢,因为<form method=''post">,那么此时将出发我们视图函数中对post请求处理的部分,此时通过return redirect(reverse('articles:article'))重定向到文章展示界面才算大功告成。那么有没有什么方法实现表单填写完成后不跳转呢,答案肯定是有的,大家只需将button type='submit'改成buttion type='button'即可,大家可以自己动手试试。

计算机