杭州电子商务研究院

Django Forms 简介

2020-10-28 08:00飞浪

介绍

Web 应用程序依靠用户交互运行。用户输入数据,这些数据经过处理或存储,随后通过网页和视图显示。使用 Django,数据收集的一个关键组件是表单。生成表单所需的方法和资产位于 Django 的FORM类中,可通过 import from django import forms访问该类。

本指南将探讨如何使用 Django 中的表单作为数据捕获工具。本指南假设您至少具有 Django 的初级知识,并对 Django MVC 有一般了解。Django 的入门指南可在此处找到。

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 %}
    

范式

这种类型的表单不服务于模型。它用于从用户那里获取信息并以某种方式处理它。一个常见的用例是登录表单。它不链接到模型,但您使用用户名和密码来验证用户。以下是如何设置简单表单的代码片段

      from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label='Your name', max_length=100)
    password = forms.PasswordInput()
    
      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>
    

第三方软件包

呈现的基本表单通常不如人们所希望的那样吸引人。它们需要在样式方面做更多的工作。为此,已经开发了第三方软件包来设计表单并对其进行改进。最常见的是:

  1. Django 小部件调整

  2. Django 酥脆形式

结论

掌握表单操作和相关方法使您能够在 Django Web 应用程序中设计更好、更有效的数据收集技术。

为了进一步巩固本指南和您对表单的了解,请遵循此官方指南了解有关FormMixins 的更多信息,这些类提供用于创建和显示表单的方法和工具。它们最常用于基于类的视图 (CBV)。

曝光25646浏览1383