字段选择()作为查询集?

rob*_*s85 11 django modelform

我需要制作一个表单,它有1个选择和1个文本输入.必须从数据库中选择.模型看起来像这样:

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

    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

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

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

        model = Province
        fields = ('name',)
        widgets = {
            'name': Select(choices=CHOICES),
        }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.select标签不会以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',)
Run Code Online (Sandbox Code Playgroud)

Yuj*_*ita 13

阅读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 )),
        }
Run Code Online (Sandbox Code Playgroud)

  • 将`CHOICES = Province.objects.values_list('id','name')`无需小部件自定义工作. (5认同)

mae*_*rsu 6

ModelForm满足您的所有需求(另请查看转换列表)

模型:

class UserProvince(models.Model):
    user = models.ForeignKey(User)
    province = models.ForeignKey(Province)
Run Code Online (Sandbox Code Playgroud)

形成:

class ProvinceForm(ModelForm):
    class Meta:
        model = UserProvince
        fields = ('province',)
Run Code Online (Sandbox Code Playgroud)

视图:

   if request.POST:
        form = ProvinceForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=True)
            obj.user = request.user
            obj.save()
   else:
        form = ProvinceForm() 
Run Code Online (Sandbox Code Playgroud)

  • +1:但不应该'commit = False',否则你会两次击中db (6认同)