如何使用来自不同模型的选择字段创建自定义 Django 表单?

faf*_*fal 3 python forms django

你如何在 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)
Run Code Online (Sandbox Code Playgroud)

我想使用<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>
Run Code Online (Sandbox Code Playgroud)

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

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

请你帮助我好吗?

sur*_*190 5

使用 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()
    )
Run Code Online (Sandbox Code Playgroud)

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

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