Django表单

时间:2020-02-23 14:33:05  来源:igfitidea点击:

在本教程中,我们将在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_viewsresponseapp.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'))
]