我有一个带有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:字段已经存在。