Django TypeError'User'对象不可迭代


问题内容

使用User.objects.all()无法遍历User对象吗?我正在尝试做同样的事情,但无济于事

我有一个表格;

class AddMemberForm(Form):
    user = forms.ChoiceField(choices=User.objects.all(),
                             initial='Choose a User',
    )

我正在尝试通过模板进行渲染。下面对应的views.py部分;

class StationHome(View):
    def get(self, request, pk):
        station = Station.objects.get(pk=pk)
        channels = Channel.objects.filter(station=station)
        members = station.members.all()
        form1 = AddMemberForm()
        return render(request, 
                      "home_station.html",
                      {"form1":form1,
                       "station":station,
                       "channels":channels,
                       "members":members,
                   },
                  )

最后是相应模板的相应部分,

<form method="post" action="{% url 'add_member' station.pk %}">
    {% csrf_token %}
    {{ form1 }}
</form>

但是由于这种形式,我无法访问URL。我收到TypeError at相应的网址'User' object is not iterable错误。

有人请帮忙。


问题答案:

使用ModelChoiceField而不是简单的ChoiceField

user = forms.ModelChoiceField(queryset=User.objects.all(),
                              empty_label="(Choose a User)")

更新 :您可以在窗体的构造函数中更改查询集。例如,如果您要从表单中排除已经添加的成员:

class AddMemberForm(Form):
    ...
    def __init__(self, *args, **kwargs):
        station = kwargs.pop('station')
        super(AddMemberForm, self).__init__(*args, **kwargs)
        if station:
            self.fields['user'].queryset = User.objects.exclude(
                                             id__in=station.members.all())

然后使用station参数创建表单:

form1 = AddMemberForm(station=station)