【问题标题】:How to create a custom Django form with select fields from different models?如何使用来自不同模型的选择字段创建自定义 Django 表单?
【发布时间】:2018-01-07 18:32:51
【问题描述】:

如何在 Django 中使用 3 种不同的模型作为表单字段来制作表单?

这些是我的模型:

class User(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=50)
    city = models.CharField(max_length=50)

class Team(models.Model):
    team_name = models.CharField(max_length=250)
    city = models.CharField(max_length=50)

class GameCategories(models.Model):
    CATEGORIES = (
        ('Senior', 'Senior'),
        ('Middle', 'Middle'),
        ('Junior', 'Junior'),
    )

    category = models.CharField(max_length=16, choices=CATEGORIES)

我想使用<select><option></option></select> 创建一个表单,上面的模型看起来像这样:

<select class="form-control">
    <option value=""></option>
    <option value="user.id">user.first_name + user.last_name</option>
    <option value="user.id">user.first_name + user.last_name</option>
    <option value="user.id">user.first_name + user.last_name</option>
</select>
<select class="form-control">
    <option value=""></option>
    <option value="gamecat.id">gamecat.category</option>
    <option value="gamecat.id">gamecat.category</option>
    <option value="gamecat.id">gamecat.category</option>
</select>
<select class="form-control">
    <option value=""></option>
    <option value="team.id">team.team_name</option>
    <option value="team.id">team.team_name</option>
    <option value="team.id">team.team_name</option>
</select>

当用户点击提交按钮填写表单后,我想将所有值(用户 ID、游戏类别 ID、团队 ID)发送到另一个视图。

实际上我不知道如何做到这一点。我想我应该创建一个ModelForm

你能帮帮我吗?

【问题讨论】:

  • 不使用 Django Form 的任何原因。选项是否应该始终包含每个模型的所有当前实例?
  • 真的很简单!您必须创建类似这样的常规表单: myForm(form.Form)

标签: python django forms


【解决方案1】:

使用 django 表单ModelChoiceField

from django import forms

from .models import GameCategories, User, Team

class CustomForm(forms.Form):
    '''Form with User, Team and GameCategories'''
    user = forms.ModelChoiceField(queryset=User.objects.all())
    team = forms.ModelChoiceField(queryset=Team.objects.all())
    game_category = forms.ModelChoiceField(
        queryset=GameCategories.objects.all()
    )

请记住,如果您希望为特定用户保留选择,您应该改用ModelForm。如果您只是将其存储为下一个请求或在 cookie 中,那么此解决方案将起作用。

另外需要注意的是__str__()方法被用作选项的标签。

【讨论】:

  • 谢谢您的回答,您能否告诉我,当我将表单发送到视图时,并且在视图中我正在创建表单类的实例时,如何获取每个表单的值模型(用户、团队、游戏类别)?
  • 您通常会验证表单,然后使用:user = form.cleaned_data['user'] 获取数据。您应该花一些时间阅读docs.djangoproject.com/en/2.0/topics/formsdocs.djangoproject.com/en/2.0/ref/forms/validation。起初它们可能看起来令人生畏,但它们充满了优秀的内容。
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 2012-12-11
  • 2019-10-22
  • 2013-09-13
  • 2018-10-22
  • 1970-01-01
  • 2012-08-03
  • 2017-05-05
相关资源
最近更新 更多