教程 > django 教程 > 阅读:59

django 表单——迹忆客-ag捕鱼王app官网

表单是用户和网站之间交互的最经典的方式。在 django 中创建表单与创建模型非常相似。django表单系统的核心组件是 form 类。我们自定义的表单类都需要继承 form类。

让我们在 app 中新建一个 forms.py 文件用来定义我们所有的应用程序表单。

首先我们创建一个用来登录的表单

from django import forms
class loginform(forms.form):
    username = forms.charfield(max_length=100)
    password = forms.charfield(widget=forms.passwordinput())

如上所示,字段类型可以使用“widget”参数进行 html 渲染;在我们的例子中,我们希望密码被隐藏,而不是显示。django 中还存在许多其他小部件:dateinput用于输入日期,checkboxinput用于复选框等。

在视图中使用表单

http 请求有两种,get 和 post。在 django 中,作为参数传递给视图的请求对象有一个名为“method”的属性,其中设置了请求的类型,所有通过 post 传递的数据都可以通过 request.post 进行访问。

让我们在 app/views.py 中创建一个用于登录的视图

def login(request):
    username = ""
    if request.method == "post":
        # 获取使用 post 提交的表单
        myloginform = loginform(request.post)
        if myloginform.is_valid():
            username = myloginform.cleaned_data['username']
    else:
        myloginform = loginform()
    return render(request, 'loggedin.html', {"username": username})

该视图显示使用表单登录之后的页面,该页面是由 loggedin.html 模板提供。 接下来我们写一个用于登录的模板,login.html


    
    django 表单登录界面 - 迹忆客
{% csrf_token %}


上面创建了一个登录的表单模板。我们看模板中的标签

{% csrf_token %}

这是用来防止跨站请求伪造 (csrf) 攻击的。

我们已经有了登录的模板,下面我们新建登录后的模板页面 loggedin.html。


    
    django 登录之后页面 - 迹忆客
    {% if username != '' %}
    you are : {{username}}
    {% else %}
    您登录失败
    {% endif %}

接下来就剩下路由的定义了,下面我们在 app/urls.py 中定义路由如下

from django.views.generic import templateview, listview
from . import views
urlpatterns = [
    path('hello/', views.hello),
    path('connection/', templateview.as_view(template_name='login.html')),
    path('login/', views.login, name='login')
]

访问 /app/connection ,然后输入用户名和密码,表单提交如下

django 表单登录

上面我们是输入了用户名和密码,如果实际情况中,我忘记了密码,或者没有填写密码。这时根据上面的例子,应该提示我们 登录失败

django 表单错误登录

自定义表单验证

在上面的例子中,当验证表单时我们使用了 is_valid() 方法。

myloginform.is_valid()

我们只使用了 django 表单自带的验证引擎,在我们的例子中只是确保这些字段是必需的。现在让我们自定义一个简单的验证规则,确保登录的用户是 usermodel中的用户 。为此,我们需要更改 app/forms.py

class loginform(forms.form):
    username = forms.charfield(max_length=100)
    password = forms.charfield(widget=forms.passwordinput())
    def clean_username(self):
        username = self.cleaned_data.get("username")
        dbuser = usermodel.objects.filter(name=username)
        if not dbuser:
            raise forms.validationerror("user does not exist in our db!")
        return username

现在,在调用“is_valid”方法后,django会自动调用 clean_username 方法。如果我们输入的用户名在usermodel中有记录,则我们会获得正确的输出。如果想检查表单的某个字段,只需添加一个以“clean_”开头的方法,然后后面跟上你的字段 例如 clean_username。 username就是我们要检查的表单的字段。这里需要注意的是,触发 forms.validationerror 是很有必要的。

我们看一下上面示例的结果

django 自定义表单验证

查看笔记

扫码一下
查看教程更方便
网站地图