我需要制作一个具有1个select和1个文本输入的表单。选择必须从数据库中获取。
模型看起来像这样:

class Province(models.Model):
    name = models.CharField(max_length=30)
    slug = models.SlugField(max_length=30)

    def __unicode__(self):
        return self.name


它的行仅由admin添加,但所有用户都可以在表单中看到它。
我想从中制作一个ModelForm。我做了这样的事情:

class ProvinceForm(ModelForm):
    class Meta:
        CHOICES = Province.objects.all()

        model = Province
        fields = ('name',)
        widgets = {
            'name': Select(choices=CHOICES),
        }


但这不起作用。选择标记不以html显示。我怎么了

更新:

此解决方案可以正常运行:

class ProvinceForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProvinceForm, self).__init__(*args, **kwargs)
        user_provinces = UserProvince.objects.select_related().filter(user__exact=self.instance.id).values_list('province')
        self.fields['name'].queryset = Province.objects.exclude(id__in=user_provinces).only('id', 'name')

    name = forms.ModelChoiceField(queryset=None, empty_label=None)

    class Meta:
        model = Province
        fields = ('name',)

最佳答案

阅读Maersu对“可行”方法的回答。

如果要自定义,请知道选择包含一个元组列表,即(('val','display_val'), (...), ...)

选择文档:


的可迭代(例如列表或元组)
2元组用作选择
领域。


from django.forms.widgets import Select


class ProvinceForm(ModelForm):
    class Meta:
        CHOICES = Province.objects.all()

        model = Province
        fields = ('name',)
        widgets = {
            'name': Select(choices=( (x.id, x.name) for x in CHOICES )),
        }

关于django - 字段choices()作为查询集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5104277/

10-12 17:43