Django Forms 简介
介绍
Django 中的表单
由于表单是数据输入组件,因此它们可能成为恶意攻击的入口点,例如SQL 注入和跨站点请求伪造。为了防止这种情况,Django 进行了一些安全检查,例如CSRF 令牌和在保存前检查表单有效性。有关表单安全性的更多信息,可以从Django 文档中了解到。
示例应用程序
为了更好地理解表单的使用,特别是 Django 中的模型表单,请考虑这样一个用例:您的客户希望构建一个库存管理 Web 应用。部分范围是构建一个用于捕获新库存项目的 Web 表单以及一个登录表单。下面是库存模型的一个片段,它影响了库存表单的设计方式。
from django.db import models
class Inventory(models.Model):
item = models.CharField(max_length=20)
item_code = models.IntegerField()
item_condition = models.CharField(max_length=50)
quantity = models.IntegerField()
def __str__(self):
return self.item
模型形式
模型表单是从现有模型派生的组件。简单来说,它们是您指定的模型专用的表单。生成模型表单非常简单。下面是Inventory模型的代码片段。作为最佳实践,Django 中的表单在forms.py中定义。
from django import forms
from .models import Inventory
class InventoryForm(forms.ModelForm):
class Meta:
# the model
model = Inventory
# the fields you want visible in the form
fields = ('item', 'item_code','item_description')
为了让用户看到表单,您必须将其呈现在 HTML 文件中。这意味着您需要一个视图和一个 HTML 文件。
views.py 中的表单视图
from .forms import InventoryForm
from django.shortcuts import render
def new_inventory(request):
if request.method == "POST": # data was sent to server
form = InventoryForm(request.POST)# instantiate form object with data sent from user
if form.is_valid(): # no errors or missing values
form.save() # save form data to database
else: # normal get request
form = InventoryForm() # instantiate empty form
return render(request, 'inventoryapp/add_inventory.html', {'form': form})
上面的代码块将Inventory模型的模型表单呈现到 HTML 页面上。
HTML 文件中的表单视图
下面是呈现表单的 HTML 文件片段。该 HTML 文件在new_inventory视图中被引用为add_inventory.html。
{% extends 'myapp/base.html' %}
{% block content %}
<h2>New inventory</h2>
<form method="POST" class="inventory-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}
范式
这种类型的表单不服务于模型。它用于从用户那里获取信息并以某种方式处理它。一个常见的用例是登录表单。它不链接到模型,但您使用用户名和密码来验证用户。以下是如何设置简单表单的代码片段
表单.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label='Your name', max_length=100)
password = forms.PasswordInput()
视图.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import LoginForm
def get_name(request):
if request.method == 'POST': # data was sent from user
# instantiate form object with data sent from user
form = LoginForm(request.POST)
if form.is_valid(): # no errors
# authenticate user and log them in
# redirect to dashboard:
return HttpResponseRedirect('/dashboard/')
else: # get request
form = LoginForm()
return render(request, 'login.html', {'form': form})
HTML 文件
<form action="/login/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
第三方软件包
呈现的基本表单通常不如人们所希望的那样吸引人。它们需要在样式方面做更多的工作。为此,已经开发了第三方软件包来设计表单并对其进行改进。最常见的是:
结论
掌握表单操作和相关方法使您能够在 Django Web 应用程序中设计更好、更有效的数据收集技术。
为了进一步巩固本指南和您对表单的了解,请遵循此官方指南了解有关FormMixins 的更多信息,这些类提供用于创建和显示表单的方法和工具。它们最常用于基于类的视图 (CBV)。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~