龙空技术网

django框架的表单form的理解和用法-7

不易9093 103

前言:

现在兄弟们对“html表单嵌套”大致比较注意,姐妹们都想要知道一些“html表单嵌套”的相关资讯。那么小编也在网摘上搜集了一些关于“html表单嵌套””的相关资讯,希望朋友们能喜欢,大家快快来了解一下吧!

表单集中的表单嵌套

在某些情况下,我们可能需要使用表单集来处理包含其他表单的表单。例如,在订单页面中,我们可能需要收集用户的联系信息和送货地址,这些信息可以通过另一个表单来收集。在这种情况下,我们可以在表单集中嵌套其他表单。以下是一些示例代码:

from django import formsclass ContactForm(forms.Form):    name = forms.CharField()    email = forms.EmailField()class ShippingForm(forms.Form):    address1 = forms.CharField()    address2 = forms.CharField(required=False)    city = forms.CharField()    state = forms.CharField()    zip_code = forms.CharField()class OrderForm(forms.Form):    contact = forms.Form(ContactForm)    shipping = forms.Form(ShippingForm)OrderFormSet = formset_factory(OrderForm, extra=0)formset = OrderFormSet()

在上面的代码中,我们定义了三个表单类:ContactForm、ShippingForm和OrderForm。OrderForm 包含了 contact 和 shipping 两个子表单,分别用于收集用户的联系信息和送货地址。然后,我们使用 forms.Form() 函数将 ContactForm 和 ShippingForm 嵌套在 OrderForm 中。

最后,我们使用 formset_factory() 函数创建了一个名为 OrderFormSet 的表单集类,该类包含多个 OrderForm 实例。注意到我们没有指定 extra 参数,因此表单集中只包含空的 OrderForm 实例。

动态添加表单

有时候我们需要在页面中动态地添加表单,例如,用户可以通过点击按钮来增加产品行。为了实现这个功能,我们可以使用JavaScript代码来动态地添加新的表单行,并在表单提交时将它们一起处理。

以下是一个示例HTML和JavaScript代码,用于动态地添加新的产品行:

<!-- HTML模板中的代码 --><form method="post">    {{ formset.management_form }}    <table>        {{ formset.as_table }}    </table>    <button id="add-product-btn" type="button">Add Product</button>    <button type="submit">Place Order</button></form><script>// JavaScript代码let formCount = {{ formset.total_form_count }};const addProductBtn = document.querySelector('#add-product-btn');addProductBtn.addEventListener('click', function() {    const table = document.querySelector('table');    const row = table.insertRow(-1);    const cell = row.insertCell(0);    const input = document.createElement('input');    input.name = `form-${formCount}-name`;    cell.appendChild(input);    // 添加其他表单字段...    formCount++;});</script>

在上面的代码中,我们首先在表单模板中使用{{ formset.management_form }}标签,该标签包含了表单集所需的隐藏字段,如TOTAL_FORMS和INITIAL_FORMS等。然后,我们将表单集渲染成一个HTML表格,并在其中包含“添加产品”按钮和“提交订单”按钮。

接下来,我们使用JavaScript代码来监听“添加产品”按钮的点击事件。每次单击该按钮时,我们都会在HTML表格的底部添加一个新的行,并根据表单集的数量为新行中的每个字段创建唯一的名称。最后,在提交表单时,Django将处理所有动态添加的表单行并生成相应的表单对象。

表单验证

在Django中,表单验证是自动执行的。当用户提交表单时,Django将自动验证每个字段,并生成一个Form实例。如果表单数据无效,则Form实例中包含错误信息,可以通过调用form.errors属性进行访问。以下是一个示例:

from django import formsclass ContactForm(forms.Form):    name = forms.CharField(max_length=50)    email = forms.EmailField()    message = forms.CharField(widget=forms.Textarea)contact_form = ContactForm(data={    'name': '',    'email': 'notanemail.com',    'message': 'Hello, world!',})if not contact_form.is_valid():    print(contact_form.errors)

在上面的代码中,我们定义了一个名为ContactForm的表单类,其中包含三个字段:name、email和message。然后,我们创建了一个ContactForm实例并将无效数据传递给它。由于name字段为空字符串且email字段不是有效的电子邮件地址,因此表单验证失败。我们使用is_valid()方法检查表单是否有效,如果无效,则输出错误信息。

自定义验证规则

除了使用Django提供的内置验证器外,我们还可以编写自己的自定义验证器。自定义验证器应该是一个函数或方法,采用一个参数并返回True或False。以下是一个示例:

from django import formsclass ContactForm(forms.Form):    name = forms.CharField(max_length=50)    email = forms.EmailField()    message = forms.CharField(widget=forms.Textarea)    def clean_name(self):        name = self.cleaned_data['name']        if len(name) < 2:            raise forms.ValidationError('Name is too short.')        return name

在上面的代码中,我们定义了一个名为clean_name()的方法,并在表单类中调用它。该方法获取表单字段的清理数据,并执行自定义验证逻辑。如果验证失败,则使用ValidationError异常引发错误。否则,该方法应返回字段的清理数据。

渲染表单

在Django中,可以使用模板系统来将表单渲染成HTML。通常,我们将表单对象传递给模板,并使用模板标记将表单的每个字段渲染为HTML元素。以下是一个示例模板代码:

<!-- templates/contact.html --><form method="post">    {% csrf_token %}    {{ form.as_p }}    <button type="submit">Submit</button></form>

在上面的代码中,我们首先使用{% csrf_token %}标签包含一个跨站请求伪造令牌。然后,我们使用{{ form.as_p }}标签将整个表单渲染为一个HTML表格,并在每个字段周围包含<p>标记。您还可以使用其他标签,例如{{ form.as_table }}和{{ form.as_ul }},以根据需要呈现表单。

处理表单提交

在Django中,可以将表单处理逻辑编写为视图函数。当用户提交表单时,Django将调用视图函数并传递包含表单数据的HttpRequest对象。以下是一个示例:

from django.shortcuts import renderfrom .forms import ContactFormdef contact(request):    if request.method == 'POST':        form = ContactForm(request.POST)        if form.is_valid():            # 处理有效表单数据...            return render(request, 'thanks.html')    else:        form = ContactForm()    return render(request, 'contact.html', {'form': form})

在上面的代码中,我们定义了一个名为contact()的视图函数,并使用ContactForm类创建了一个表单实例。如果请求方法是POST,则构造一个带有请求数据的新的ContactForm实例,并检查它是否有效。如果表单有效,则执行自

在上面的代码中,我们定义了一个名为contact()的视图函数,并使用ContactForm类创建了一个表单实例。如果请求方法是POST,则构造一个带有请求数据的新的ContactForm实例,并检查它是否有效。如果表单有效,则执行自定义处理逻辑并重定向到另一个页面。否则,将显示原始表单以及任何错误信息。

如果请求方法不是POST,则表明用户刚刚打开了页面,并且我们只需渲染原始表单即可。

表单字段类型

在Django中,有许多不同的表单字段类型可供选择。以下是一些常见的表单字段类型:

CharField:用于接受字符串输入。IntegerField:用于接受整数输入。FloatField:用于接受浮点数输入。DecimalField:用于接受小数输入。EmailField:用于接受电子邮件地址输入。BooleanField:用于接受布尔值输入(例如复选框)。ChoiceField:用于从预定义选项列表中选择一个值。ModelChoiceField:与ChoiceField相似,但从数据库模型中获取选项列表。DateField和DateTimeField:用于接受日期和时间输入。FileField和ImageField:用于接受文件上传。

标签: #html表单嵌套