Django表单“list”对象没有属性“iterator”

2024-10-03 13:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我是django的新手,我尝试根据以下答案连接来自不同模型的不同查询集:https://stackoverflow.com/a/434755/4465450

当我试图在我的管理员中查看它时,我一直收到这个错误。在

'list' object has no attribute 'iterator'

我在我的表单.py在

 from django import forms
 from itertools import chain
 from content.models import Article, Tutorial

 class DashboardChoiceForm(forms.Modelform):
     dashboard_select = forms.ModelChoiceField(queryset=None)

     def __init__(self, *args, **kwargs):
         super(DashboardChoiceForm, self).__init__(*args, **kwargs)
         article_list = Article.objects.all()
         tutorial_list = Tutorial.objects.all()
         self.fields['dashboard_select'].queryset = list(chain(article_list, tutorial_list))

我把它放在我的管理页面上,如下所示:

^{pr2}$

我要做的是在rowsone admin上创建一个下拉列表,以便用户可以选择一个内容项(文章或教程)显示在该行中。在


Tags: djangofromimportselfchaininitarticleargs
1条回答
网友
1楼 · 发布于 2024-10-03 13:29:48

这行行不通:

self.fields['dashboard_select'].queryset = list(chain(article_list, tutorial_list))

问题不是从右边来的,而是从左边来的。ModelChoiceField要求{}是实际的查询集,而不是列表。在

如果您想提供一个列表,您应该使用另一个字段类型,即ChoiceField。然后你需要分配选择。它们必须是2元组的列表,其中第一项是实际值,第二项是显示的文本。在

它变得有点棘手,因为实际值必须是字符串,或者可以转换为字符串的东西。例如,我们可以对文章执行“article”<;pk>;“和教程”。在

^{pr2}$

您可以将str(obj)替换为向用户显示对象的任何合理方式。在

然后,当您的表单被验证时,您将获得该值,您应该将其解析回:

from django.core.exceptions import ObjectDoesNotExist, ValidationError

# on your form class
def clean_dashboard_select(self):
    data = self.cleaned_data['dashboard_select'] # will be, eg: "article_42"
    try:
        typename, value = data.split('_')
        pk = int(value)
    except ValueError:
        raise ValidationError('cannot understand %s' % data)
    try:
        if typename == 'article':
            return Article.objects.get(pk=pk)
        if typename == 'tutorial':
            return Tutorial.objects.get(pk=pk)
    except ObjectDoesNotExist:
        raise ValidationError('No %s with pk %d' % (typename, pk))
    raise ValidationError('Never heard of type %s' % typename)

编辑(来自注释)-要添加分区组,请按如下方式更改选项:

choices = (
    ('Articles', tuple(('article_%d' % obj.pk, str(obj)) for obj in article_list)),
    ('Tutorials', tuple(('tutorial_%d' % obj.pk, str(obj)) for obj in tutorial_list)),
)

相关问题 更多 >