Django表单
在本教程中,我们将在Django项目中讨论Forms。
在之前的教程中,我们讨论了Django模板和Django模型。
今天,我们将看到Django Forms的工作方式以及将它们与Templates一起使用。
Django表单
表单是任何需要用户输入的Web应用程序的重要组成部分。
无论是登录表单,输入调查详细信息,撰写教程 文章和注释(就像我们在路上一样!)。
Django Forms基本上做了三件事:
读取用户输入
验证它。
将其转换为Python数据类型/对象
形式与模型
模型将字段映射为数据库的类型。
表单将字段映射为Python类型。
首先讨论HTML表单,因为这些表单最终会显示在屏幕上。
HTML表单
要使用HTML创建表单,请将其包含在 <form> ... <form
标签中
例:
<form action="/goto_url/" method="post"> <label for="name">Enter name: </label> <input id="name" type="text" name="name_field" value="."> <input type="submit" value="OK"> </form>
表单标签由一个动作组成,当单击"提交"输入类型时,该动作会将您带到提到的" URL"路径。
在该方法中,我们通常将其设置为GET或者POST。
该标签用作与其链接的输入标签的ID的提示。
注意:还有其他几个字段,例如DateField,BooleanField和许多其他可在表单内部使用的字段。
GET与POST
GET用于以字符串形式发送数据,该字符串将附加到URL。
这不会更改数据库中的任何内容。
POST方法用于捆绑数据并将其发送到服务器。
它得到了回应。
通常用于更新数据库。
GET容易受到跨伪造站点的攻击,因为数据本身在url中可用。
在诸如密码表单之类的情况下,不应使用GET。
POST对攻击更具抵抗力。
Django Form类
Django通过处理微小的细节(例如在HTML页面中创建和重新创建表单,验证输入的数据并执行对表单设置的任何操作)来使我们的生活更轻松。
就像HTML具有form标签一样,Django也具有Form
类。
Form类定义为:
from django import forms class FirstForm(forms.Form): name = forms.CharField(label='Your name', max_length=100)
我们可以使用HTML页面中的Django模板来呈现此类。
单击"提交"按钮后,Form类将使用上述类的实例上的is_valid()方法进行验证检查。
清除验证后,表单数据将在Form类的cleaned_data属性中提供。
Django表单可以有两种类型:
Unbound –表单中没有数据。
他们是空的。
绑定-用这些类型的表单填充数据。
以上概念可能难以理解。
最好的方法是通过榜样学习。
在下一节中,我们将创建一个实现了Forms的基本Django Web应用程序。
我们的应用程序将获取响应并将其显示在下一个屏幕上。
快速设置
让我们创建一个新的Django项目,并其中启动一个名为" responseapp"的新应用。
以下是我们在终端中输入的命令的有序列表。
要了解详细信息,请访问我们的第一本Django教程。
mkdir DjangoForms cd DjangoForms virtualenv -p /usr/local/bin/python3 env source env/bin/activate pip3 install django django-admin startproject DjangoFormsBasics cd DjangoFormsBasics python3 manage.py runserver django-admin startapp responseapp cd responseapp mkdir templates cd templates touch responseform.html touch thankyou.html
在" responseapp"内部,我们创建了一个模板文件夹,其中包含html文件。
在模板文件夹内,为接下来将要构建的两个页面化的Web应用程序添加两个html文件。
创建两个新的python文件:forms.py和urls.py:
cd .. touch forms.py touch urls.py
项目结构
不要忘记在settings.py文件中添加Django应用程序:
代码
在Forms.py文件中添加以下代码:
from django import forms class MyForm(forms.Form): name = forms.CharField(label='Enter your name', max_length=100) email = forms.EmailField(label='Enter your email', max_length=100) feedback = forms.CharField(widget=forms.Textarea(attrs={'width':"100%", 'cols' : "80", 'rows': "20", }))
我们添加了三个字段:CharFields,EmailFields和指定了TextArea宽度和高度的CharField。
views.py文件的代码如下:
from django.shortcuts import render from responseapp.forms import MyForm def responseform(request): form = MyForm() return render(request, 'responseform.html', {'form':form});
对于具有POST方法的Django表单,必须使用csrf(跨站点请求伪造)。
这通过将完整的表单实例传递给HTML来呈现Django表单并使用模板语言。
我们的初始responseform.html类的代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Django Forms Tutorial</title> </head> <body> <h2>Django Forms Tutorial</h2> <form> {% csrf_token %} {{form}} <input type="submit" value="Submit" </form> </body> </html>
在内部DjangoFormBasics文件夹的终端上运行以下命令:
python3 manage.py migrate python3 manage.py runserver
注意:您必须指定url模式。
查看本教程后面定义的urls.py文件。
以下是实际应用程序的输出。
哇!水平看起来很难看。
我们可以按照以下顺序安排表单:
- form.as_ul:将字段显示为无序列表
- form.as_p:在单独的行中将字段显示为段落
- form.as_table:将字段显示为表单元素
<table> {{form.as_table}} </table>
对于" form_as_ul",您必须将其包含在" ul"标签中。
另外,"提交"按钮不起作用,让我们添加另一个HTML页面,该页面将捕获表单响应并显示在此处。
下面给出了responseform.html的更新代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Django Forms Tutorial</title> </head> <body> <h2>Django Forms Tutorial</h2> <form action="/thankyou/" method="post"> {% csrf_token %} <table> {{form.as_table}} </table> <input type="submit" value="Submit" </form> </body> </html>
在上面的代码中,我们添加了方法和操作。
单击提交时,将把用户带到表单数据已过帐的/thankyou /页面。
views.py文件的代码如下:
from django.shortcuts import render from responseapp.forms import MyForm from django.template import loader from django.http import HttpResponse def responseform(request): #if form is submitted if request.method == 'POST': myForm = MyForm(request.POST) if myForm.is_valid(): name = myForm.cleaned_data['name'] email = myForm.cleaned_data['email'] feedback = myForm.cleaned_data['feedback'] context = { 'name': name, 'email': email, 'feedback': feedback } template = loader.get_template('thankyou.html') return HttpResponse(template.render(context, request)) else: form = MyForm() return render(request, 'responseform.html', {'form':form});
最初,else语句将执行并创建一个空表单。
稍后,当单击"提交"时,将执行" if"块,并且如果验证了表单,我们将使用带有Django模板的加载器加载thankyou.html页面。
表单数据通过以下方式传递给thankyou.html
类:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Thank You</title> </head> <body> <h2>Response Entered by you:</h2> <form method="post"> <ul> <li>Name: {{ name }}</li> <li>Email: {{ email }}</li> <li>Feedback: {{ feedback }}</li> </ul> </form> </body> </html>
在" responseapp"文件夹中创建的" urls.py"的代码是:
from django.urls import path from django.contrib import admin from responseapp import views as responseapp_views urlpatterns = [ path('response/', responseapp_views.responseform), path('thankyou/', responseapp_views.responseform), path('', admin.site.urls), ]
responseapp_views
与responseapp.views
相同。
它从应用程序启动的地方调用views.py文件。
以下urls.py文件必须包含在DjangoForm项目中定义的外部urls.py文件中:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('responseapp.urls')) ]