Django - 选择一个有效的选择。这种选择不是可用的选择之一

时间:2017-12-31 09:23:55

标签: django twitter-bootstrap django-models django-forms django-templates

以下是我的表格:

class RoleForm(forms.ModelForm):
    class Meta:
        model = models.RoleModel
        fields = ['name']

class FeatureForm(forms.ModelForm):
    role = forms.ModelChoiceField(queryset=models.RoleModel.objects.values_list('name', flat=True).distinct())
    class Meta:
        model = models.FeatureModel
        fields = ['role','feature']

在我的引导程序表单中,选项显示正确。我得到了所有角色的列表。但是,如果我填写要素表格并点击提交,则表示 - "选择一个有效的选择。这个选择不是可用的选择之一。"

我的模特是:

class RoleModel(models.Model):
    name = models.CharField(validators=[alphanumeric], max_length=50, unique=True, blank=False)

class FeatureModel(models.Model):
    role = models.ForeignKey(RoleModel, on_delete=models.PROTECT)
    feature = models.CharField(validators=[alphanumeric], max_length=10, unique=True)

我的bootsrtap表格是:

<form action="{% url 'feature_form' %}" novalidate method="POST">{% 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 %}
                {{ item }}
                {% endfor %}
                </select></p>
                {% for error in fform.role.errors %}
                <p><small class="alert-danger">{{ error }}</small></p>
                {% endfor %}
                </div>

                <div class="col">
                <label for="feature">{{ fform.feature.label }</label>
                <p><input type="text" class="form-control" id="feature" name="feature"
                {% if fform.feature.value is not None %}
                value="{{ fform.feature.value }}"
                {% endif %}
                ></p>
                {% for error in fform.feature.errors %}
                <p><small class="alert-danger">{{ error }}</small></p>
                {% endfor %}
                </div>
            </div>

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

我的需要很简单。第二种形式(FeatureForm)有两个字段。角色是另一个模型的外键,以及在要素名称中键入的文本字段。在我的客户端,我需要将外键显示为带有列表的选择选项。我从这个选择中选择了一个值,输入了feature的值并点击了save。它必须保存。

client side screenshot

1 个答案:

答案 0 :(得分:1)

它不起作用,因为您的查询集仅包含名称,但您需要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):
         return self.name

class FeatureForm(forms.ModelForm):
    class Meta:
        model = models.FeatureModel
        fields = ['role', 'feature']

    def __init__(self, *args, **kwargs):
        super(FeatureForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs = {'class': 'form-control'}

<form action="{% url 'feature_form' %}" novalidate method="POST">
    {% 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>
            {% endfor %}
        </div>
        <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>
            {% endfor %}
        </div>
    </div>
    <input class='btn btn-primary btn-sm' type='submit' value='Save'>                
</form>

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

<select>
    <option value="1">Name 1</option>
    <option value="2">Name 2</option>
</select>

其中value是一个id,在您的情况下是RoleModel的主键。您选择的选项不具备此值。