天天看点

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

作者:不易9093

在以下示例中,我们需要为每个用户创建一个配置文件。配置文件包括用户的个人信息(如姓名和电子邮件地址)以及许多其他设置(如偏好和选项)。为了简化代码,这里只展示了一部分字段和选项。

首先,我们定义一个ProfileForm类,该类继承自Django的forms.ModelForm类:

from django import forms
from .models import Profile

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['name', 'email']

    def __init__(self, *args, **kwargs):
        super(ProfileForm, self).__init__(*args, **kwargs)

        # 添加偏好选项
        self.fields['color_scheme'] = forms.ChoiceField(
            choices=Profile.COLOR_SCHEMES,
            widget=forms.RadioSelect(attrs={'class': 'form-check-input'})
        )

        # 添加开关选项
        self.fields['notifications'] = forms.BooleanField(
            required=False,
            widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
        )           

在上面的代码中,我们为模型Profile定义了一个表单,并添加了两个额外的字段:color_scheme和notifications。color_scheme是一个单选按钮组,它使用choices参数指定可用选项。notifications是一个复选框,它使用required=False参数表示此项不是必需的。

然后,我们在视图中使用此表单:

from django.shortcuts import render, redirect
from .forms import ProfileForm
from .models import Profile

def create_profile(request):
    if request.method == 'POST':
        form = ProfileForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()
            return redirect('profile_list')
    else:
        form = ProfileForm()

    return render(request, 'create_profile.html', {'form': form})           

在上面的代码中,我们首先检查请求方法是否为POST。如果是,则创建一个ProfileForm实例并验证其数据。如果表单有效,则我们将提交用户的个人信息和选项(颜色方案和通知偏好)保存到数据库中,并将用户重定向到配置文件列表页面。如果请求方法为GET,则我们返回一个带有空表单的页面以供填写。

最后,在HTML模板中,我们可以动态呈现表单以包含额外的字段:

<form method="post">
  {% csrf_token %}
  <div class="form-group">
    {{ form.name.label_tag }}
    {{ form.name }}
  </div>
  <div class="form-group">
    {{ form.email.label_tag }}
    {{ form.email }}
  </div>
  <div class="form-group">
    <label>Color Scheme:</label><br>
    {% for radio in form.color_scheme %}
      <div class="form-check">
        {{ radio.tag }}
        {{ radio.choice_label }}
      </div>
    {% endfor %}
  </div>
  <div class="form-group">
    <div class="form-check">
      {{ form.notifications }}
      <label class="form-check-label">Receive notifications</label>
    </div>
  </div>
  <button type="submit" class="btn btn-primary">Save</button>
</form>           

在上面的代码中,我们首先使用{{ form.name }}和{{ form.email }}呈现用户的个人信息字段。然后,我们使用一个循环遍历所有单选按钮,并为每个单选按钮添加一个包含标签和输入的<div>元素。最后,我们使用{{ form.notifications }}呈现复选框,并为其添加一个标签。

Bootstrap表单样式

如果您使用Bootstrap作为CSS框架,则可以使用Django Bootstrap Forms库来轻松地将Bootstrap样式应用于您的表单。

首先,请确保安装了Django Bootstrap Forms库。然后,在HTML模板中,您可以使用以下代码来呈现带有Bootstrap样式的表单:

{% load bootstrap4 %}

<form method="post">
  {% csrf_token %}
  <div class="form-group">
    {{ form.name|as_crispy_field }}
  </div>
  <div class="form-group">
    {{ form.email|as_crispy_field }}
  </div>
  <div class="form-group">
    {{ form.message|as_crispy_field }}
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>           

在上面的代码中,我们首先使用{% load bootstrap4 %}标签加载Bootstrap模板标记。然后,我们使用as_crispy_field过滤器将每个表单字段转换为具有Bootstrap样式的HTML。最后,我们添加一个提交按钮。

此外,您还可以使用以下代码将整个表单呈现为Bootstrap样式的水平表单:

{% load bootstrap4 %}

<form method="post" class="form-horizontal">
  {% csrf_token %}
  <div class="form-group">
    <label class="col-sm-2 control-label">{{ form.name.label }}</label>
    <div class="col-sm-10">
      {{ form.name|as_crispy_field }}
    </div>
  </div>
  <div class="form-group">
    <label class="col-sm-2 control-label">{{ form.email.label }}</label>
    <div class="col-sm-10">
      {{ form.email|as_crispy_field }}
    </div>
  </div>
  <div class="form-group">
    <label class="col-sm-2 control-label">{{ form.message.label }}</label>
    <div class="col-sm-10">
      {{ form.message|as_crispy_field }}
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-primary">Submit</button>
    </div>
  </div>
</form>           

在上面的代码中,我们为表单添加了form-horizontal类,并使用col-sm-*类调整每个字段和其标签的样式。

好的,下面是一个详细的Django表单字段定义示例,包括字符串、整数、浮点数、日期和时间字段。

from django import forms
from django.forms import ModelForm
from .models import Product, Order

class ProductForm(ModelForm):
    name = forms.CharField(
        max_length=100,
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )
    description = forms.CharField(
        widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 3})
    )
    price = forms.DecimalField(
        max_digits=8, decimal_places=2,
        widget=forms.NumberInput(attrs={'class': 'form-control'})
    )
    quantity = forms.IntegerField(
        widget=forms.NumberInput(attrs={'class': 'form-control'})
    )

    class Meta:
        model = Product
        fields = ['name', 'description', 'price', 'quantity']

class OrderForm(ModelForm):
    product = forms.ModelChoiceField(queryset=Product.objects.all(), empty_label=None)
    order_date = forms.DateField(
        widget=forms.DateInput(attrs={'type': 'date', 'class': 'form-control'})
    )
    order_time = forms.TimeField(
        widget=forms.TimeInput(attrs={'type': 'time', 'class': 'form-control'})
    )

    class Meta:
        model = Order
        fields = ['product', 'order_date', 'order_time']           

在上面的代码中,我们首先导入必要的模块并定义了ProductForm和OrderForm两个表单。在ProductForm中,我们添加了四个字段:name、description、price和quantity。对于每个字段,我们都使用不同的小部件来呈现其内容。

对于字符串字段name,我们使用forms.CharField,并指定最大长度为100。在呈现表单时,我们将该字段转换为一个带有form-control类的文本输入框。

对于文本字段description,我们使用forms.CharField,并将其转换为带有form-control类和3行高的多行文本框。

对于价格字段price,我们使用forms.DecimalField,并将其转换为带有form-control类的数字输入框。

对于数量字段quantity,我们使用forms.IntegerField,并将其转换为带有form-control类的数字输入框。

在OrderForm中,我们添加了三个字段:product、order_date和order_time。product是一个外键字段,它使用forms.ModelChoiceField并指定所有可用产品的查询集。

对于日期字段order_date,我们使用forms.DateField,并将其转换为带有form-control类的日期选择器。

对于时间字段order_time,我们使用forms.TimeField,并将其转换为带有form-control类的时间选择器。

注意,对于日期和时间字段,我们需要为其小部件指定type属性,以便正确呈现浏览器原生日期和时间选择器。

下一篇: 开门大吉