Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-选择一个有效的选项。该选择不是可用的选择之一_Django_Twitter Bootstrap_Django Models_Django Forms_Django Templates - Fatal编程技术网

Django-选择一个有效的选项。该选择不是可用的选择之一

Django-选择一个有效的选项。该选择不是可用的选择之一,django,twitter-bootstrap,django-models,django-forms,django-templates,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

这是我的表格:

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']
在我的引导表单中,选项正确显示。我得到了所有角色的列表。但如果我填写功能表并点击submit,它会显示“选择一个有效的选项。该选项不是可用的选项之一。”

我的模型是:

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>
{%csrf\u令牌%}
{{fform.role.label}

它不起作用,因为您的查询集只包含名称,但您需要
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'}


{%csrf_令牌%}
{{fform.role.label}
{{fform.role}

{fform.role.errors%中的错误为%0} {{error}}

{%endfor%} {{fform.feature.label} {{fform.feature}}

{fform.feature.errors%中的错误为%0} {{error}}

{%endfor%}
编辑:否则,本例中的选择输入应构造为:

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

名字1
名称2

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

谢谢您的回答。这样可以保存数据。但是,在客户端的选择选项中,我没有得到值,而是显示为RoleModel对象(3)。我们如何调整它以使select显示值而不是对象?将str添加到
RoleModel
。我已经编辑了我的答案。这就像一个符咒。谢谢。至于我,我想了解feature form中的init函数到底做了什么?init用于将对象实例自定义为特定的初始状态。在本例中,它被使用将属性类添加到字段中,这样就不必在widgets Meta option中将表单控件单独添加到每个字段,甚至不必在template中使用templatetags。
<select>
    <option value="1">Name 1</option>
    <option value="2">Name 2</option>
</select>