从cleaning_data创建字段的查询集

时间:2013-09-09 20:16:48

标签: django django-queryset django-forms django-formwizard

如何在不访问数据库的情况下从清理过的数据中创建querysetlist? 我在这里使用Django 1.5 FormWizardModelFormSet。以下内容不适用于错误:

  

'list'对象没有属性'all'

这意味着您无法使用列表,可以吗?

def get_form(self, step=None, data=None, files=None):
    form = super(MyWizard, self).get_form(step=step, data=data, files=files)
    #...
    data = self.get_cleaned_data_for_step('a')
    list = []
    for item in data:
        list.append(item['car']) # This is the choice of a ForeigenKey
    #...
    form.fields['name'].queryset = list

这是有效的,但在我看来,你做了两次工作:

def get_form(self, step=None, data=None, files=None):
    form = super(MyWizard, self).get_form(step=step, data=data, files=files)
    #...
    data = self.get_cleaned_data_for_step('a')
    list = []
    for item in data:
        list.append(item['car'].id) # This is the choice of a ForeigenKey
    #...
    form.fields['name'].queryset = SomeClass.objects.filter(pk__in=list)

那么有办法吗?

2 个答案:

答案 0 :(得分:0)

您不能使用列表代替查询集,您必须将查询集分配给字段queryset属性,因此第一个错误。你必须点击数据库来制作查询集,所以我不确定你在问什么。您可以使用list comp:

来改进代码
my_list = [item['car'].id for item in data]

答案 1 :(得分:0)

也许您可以发布表单声明,但似乎nameModelChoiceField,因此需要一个查询集。您可以将其转换为简单的ChoiceField,但您必须构建choices

form.fields['name'].choices = [(item['car'].id, unicode(item['car'])] for item in data]

但是,我不确定这是否会自动保存,如果这是ModelForm,但我们需要表格声明来告诉我们。