Django - 自定义表单,特别是字段的外观

Posted

技术标签:

【中文标题】Django - 自定义表单,特别是字段的外观【英文标题】:Django - Customize Form, Specifically how fields look 【发布时间】:2021-04-04 08:22:25 【问题描述】:

我有一个包含多个字段的表单类。其中之一是名字和姓氏字段。 我的目标是在我的 html 文件中修改我的表单,以便它可以接收输入并将其传递给模型对象。但是,我希望这不会改变我的表单显示方式。问题是当我使用 django 的模板语言时,这些字段的显示方式不同。

我尝试用 django 的模板语言修改名字字段,方法是将以下引导代码替换为 django 模板语言代码:

<div class="form-group col-md-12">

<label for=" form.first_name.id_for_label ">First Name</label>

<input type="text" class="form-control" id="first_name" placeholder="Ex. John"> </div>

已改为:

<div class="form-group col-md-12">

form.first_name.label_tag

form.first_name </div>

这不起作用。我希望名字字段与姓氏字段显示相同。我该怎么做?

我现在的完整代码:

<div class="form-row">
             form.first_name.errors 
            <div class="form-group col-md-12">
                <!--<label for=" form.first_name.id_for_label ">First Name</label>-->
                <!--<input type="text" class="form-control" id="first_name" placeholder="Ex. John">-->
                 form.first_name.label_tag 
                 form.first_name 
            </div>


        </div>

        <div class="form-row">
            <div class="form-group col-md-12">
                <label for="last_name">Last Name</label>
                <input type="text" class="form-control" id="last_name" placeholder="Ex. Doe">
            </div>
        </div>

【问题讨论】:

【参考方案1】:

您想要显示名字字段以显示与姓氏字段相同的显示,那么您需要使用相同样式的代码呈现两个字段。

forms.py

from django import forms
from django.core.validators import RegexValidator


class UserForm(forms.Form):
    first_name = forms.CharField(widget=forms.TextInput(attrs='placeholder': "first name"), required=True, max_length=50, validators=[ RegexValidator('^[a-zA-Z ]*$', message='Please enter only alphabetical letters')], label=u'First Name')
    last_name = forms.CharField(widget=forms.TextInput(attrs='placeholder': 'last name'), required=True, max_length=50,validators=[RegexValidator('^[a-zA-Z ]*$', message='Please enter only alphabetical letters')],label=u'Last Name')

    class Meta():
        fields = ['first_name', 'last_name']

views.py

from django.shortcuts import render
def render_form(request):
    form = UserForm(request.POST or None)
    return render(request, 'form.html', 'form': form)

form.html

    % for field in form %
    <div class="form-group col-md-6">
        <label class="col-form-label font-weight-normal">
             field.label  
            % for error in field.errors %
                <strong class="text-danger font-weight-normal" style="padding-left: 5px">* error|escape </strong>
            % endfor %
        </label>
        <div>
            <input name=" field.name " class="form-control"  type="text" value=" field.value|default_if_none:'' "
                   placeholder="field.field.widget.attrs.placeholder">
        </div>
    </div>
   % endfor %

在标签&lt;div&gt; 中,您将看到标签,并且在表单提交和输入时出现任何错误&lt;div&gt; 将显示带有占位符的名字和姓氏字段。

【讨论】:

抱歉这么晚才回复。如果我的输入数据之一是复选框怎么办?该复选框现在应该是一个普通的复选框,但它现在显示为一个输入字段 基本上,我将如何指定复选框和文本字段的字段类型? 您可以从字段名称 % if field.name == "checkbox" % 显式检查并从 html 标签呈现复选框。 是的!我刚刚这样做了,它有效!感谢您的帮助!

以上是关于Django - 自定义表单,特别是字段的外观的主要内容,如果未能解决你的问题,请参考以下文章

动态自定义 django 表单小部件

Django 0.7

使用注册表单添加到自定义用户字段(django)

根据值在 Admin 中自定义 Django 表单字段

如何在 Django 管理员中为模型字段使用自定义表单字段?

自定义 django 表单字段渲染