字段选择()作为查询? [英] field choices() as queryset?

查看:115
本文介绍了字段选择()作为查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

def __unicode __(self):
return self.name

它的行仅由管理员添加,但所有用户都可以在表单中查看。
我想从中创建一个ModelForm。我做了这样的事情:

  class ProvinceForm(ModelForm):
class Meta:
选择=省.objects.all()

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

但它不起作用。选择标签不显示在html中。我的错误是什么?



更新:



>

  class ProvinceForm(ModelForm):
def __init __(self,* args,** kwargs):
super省钱,自我).__ 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 =无)

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


解决方案

阅读Maersu的工作方法的答案。



如果你想自定义,知道选择需要一个元组列表,即(('val','display_val'),(。 ..),...)



选择doc:


一个可迭代(例如,列表或元组)
2元组的,以作为此
字段的选择使用。




'pre> 从django.forms.widgets导入选择


类ProvinceForm(的ModelForm):
类元:
的选择= Province.objects.all()

型=省
栏=( '名称')
部件= {
'名' :select(choices =((x.id,x.name)for x in CHOICES)),
}


I need to make a form, which have 1 select and 1 text input. Select must be taken from database. model looks like this:

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

    def __unicode__(self):
        return self.name

It's rows to this are added only by admin, but all users can see it in forms. I want to make a ModelForm from that. I made something like this:

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

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

but it doesn't work. The select tag is not displayed in html. What did I wrong?

UPDATE:

This solution works as I wanto it to work:

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',)

解决方案

Read Maersu's answer for the method that just "works".

If you want to customize, know that choices takes a list of tuples, ie (('val','display_val'), (...), ...)

Choices doc:

An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this field.

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 )),
        }

这篇关于字段选择()作为查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆