Django - 选择一个有效的选择.该选择不是可用的选择之一 [英] Django - Select a valid choice. That choice is not one of the available choices

查看:35
本文介绍了Django - 选择一个有效的选择.该选择不是可用的选择之一的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的表格:

class RoleForm(forms.ModelForm):元类:模型 = 模型.角色模型字段 = ['姓名']类 FeatureForm(forms.ModelForm):role = forms.ModelChoiceField(queryset=models.RoleModel.objects.values_list('name', flat=True).distinct())元类:模型 = 模型.特征模型字段 = ['角色','功能']

在我的引导程序表单中,选项显示正确.我得到了所有角色的列表.但是,如果我填写功能表单并点击提交,它会说 - 选择一个有效的选择.该选择不是可用的选择之一."

我的模型是:

class RoleModel(models.Model):name = models.CharField(validators=[alphanumeric], max_length=50, unique=True, blank=False)类 FeatureModel(models.Model):role = models.ForeignKey(RoleModel, on_delete=models.PROTECT)功能=models.CharField(验证器=[字母数字],最大长度=10,唯一=真)

我的 bootsrtap 形式是:

{% csrf_token %}<div class="row"><div class="col"><label for="role">{{ fform.role.label }}</label><p><select class="form-control id="role" name="role">{% for item in fform.role %}{{ 物品 }}{% 结束为 %}</选择></p>{% for error in fform.role.errors %}<p><small class="alert-danger">{{ error }}</small></p>{% 结束为 %}

<div class="col"><label for="feature">{{ fform.feature.label }</label><p><input type="text" class="form-control" id="feature" name="feature"{% 如果 fform.feature.value 不是 None %}value="{{ fform.feature.value }}"{% 万一 %}></p>{% for error in fform.feature.errors %}<p><small class="alert-danger">{{ error }}</small></p>{% 结束为 %}

<input class='btn btn-primary btn-sm' type='submit' value='Save'></表单>

我的需求很简单.第二个表单 (FeatureForm) 有两个字段.角色是另一个模型的外键和一个文本字段,用于输入特征名称.在我的客户端,我需要将外键显示为带有列表的选择选项.我从这个选择中选择了一个值,输入功能的值并点击保存.它必须保存.

解决方案

它不起作用,因为您的查询集仅包含名称,但您需要 RoleModel 的 id/主键.由于您的选择没有 ID,因此它们不是有效的选择.

首先,您的 RoleModel name 设置为 unique,因此查询 distinct() 名称值没有意义,因为它们将是不同的已经通过独特的定义.

您也不需要构建自己的选择输入.Django 会处理这个问题.

您只需要:

class RoleModel(models.Model):name = models.CharField(validators=[alphanumeric], max_length=50, unique=True, blank=False)def __str__(self):返回 self.name类 FeatureForm(forms.ModelForm):元类:模型 = 模型.特征模型字段 = ['角色','功能']def __init__(self, *args, **kwargs):super(FeatureForm, self).__init__(*args, **kwargs)对于 self.fields 中的字段:self.fields[field].widget.attrs = {'class': 'form-control'}

{% csrf_token %}<div class="row"><div class="col"><label for="role">{{ fform.role.label }}</label><p>{{ fform.role }} </p>{% for error in fform.role.errors %}<p><small class="alert-danger">{{ error }}</small></p>{% 结束为 %}

<div class="col"><label for="feature">{{ fform.feature.label }</label><p>{{ fform.feature }}</p>{% for error in fform.feature.errors %}<p><small class="alert-danger">{{ error }}</small></p>{% 结束为 %}

<input class='btn btn-primary btn-sm' type='submit' value='Save'></表单>

否则,在这种情况下,选择输入应构造为:


                
            
            
发送“验证码”获取 | 15天全站免登陆