将选择加载到ChoiceField-奇怪的行为



我有一个带有peacefield的django形式,在其中我动态加载了一些选择:

class EntryForm(forms.Form):
    project = forms.ChoiceField()
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(EntryForm, self).__init__( *args, **kwargs)
        CHOICES2=[]
        for x in Project.objects.all() :
            if user in x.users.all():
                CHOICES2.append((x.name,x.name)) 
        CHOICES1 = [(x.name,x.name) for x in Project.objects.all()]
        print CHOICES2==CHOICES1 #this is True in this case
        self.fields['project']=forms.ChoiceField(choices=CHOICES2)

使用{{form.as_table}}将表单加载到模板中。该表格没有显示项目字段的下拉。现在是奇怪的事情:如果我将最后一行更改为:

self.fields['project']=forms.ChoiceField(choices=CHOICES1)

它有效,尽管" =="的打印语句"比较返回true(列表是有意的 - 这仅是用于测试(。我真的不知道这甚至可以在技术上工作。

编辑 - 我的项目模型:

class Project(BaseModel):
    name  = models.CharField(max_length=80)
    users = models.ManyToManyField(User)

您的字段名为 project已经存在,并且无需像您一样构造另一个。最好只是在现有字段上设置选择:

self.fields['project'].choices = CHOICES2

,但也许您最好使用ModelChoiceField:

project = ModelChoiceField(queryset=Project.objects.none())

,然后在 init 中设置您想要的QuerySet so:

self.fields['project'].queryset=Project.objects.filter(users__in=[user])

..应该为您提供与user相关的所有项目的列表。

我认为您必须使用QuerySet参数,这是强制性的:https://docs.djangoproject.com/en/1.8/ref/forms/fields/#django.forms.modelchoicefield.queryset.queryset

ChoiceField必须用(querySet = none(声明,在__init__方法中,您可以完成查询:https://docs.djangoproject.com/en/1.11/ref/forms/fields/#fields-whith handle-relationships

问题可能是关于查询的执行顺序或非液体查询的缓存。

我同意Little_birdie:字段已经存在。

最新更新