如何在Django模板中输出表单字典

0 投票
1 回答
2247 浏览
提问于 2025-04-17 15:55

我在视图中保存了一个表单列表作为变量,然后把它传给模板。

当我在模板中遍历这个表单列表时,出现了一个错误:

AttributeError: 'long' object has no attribute 'get'

我最开始尝试把表单保存在一个字典里,但也遇到了同样的错误。我可以遍历传给模板的查询集,但这个表单的列表或字典似乎无法被遍历。

有没有什么解决办法呢?

这是我相关的代码:

forms.py

from django.contrib.auth.models import User
from django import forms
from apps.account.models import UserProfile

class StaffUserTypeForm(forms.Form):
    user_type = forms.ChoiceField(choices=UserProfile.STAFF_CHOICES)

account/models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    DEFAULT = 0
    ADMIN = 1
    MANAGER = 2
    COORDINATOR = 3
    REALTOR = 4
    TEAM_CAPTAIN = 5
    PROPERTY_OWNER = 6
    PRELOAD = 7
    BILLING = 8
    COORDINATOR_PRELOAD = 9

    STAFF_CHOICES = (
        (ADMIN, 'Admin'),
        (MANAGER, 'Manager'),
        (COORDINATOR, 'Coordinator'),
        (COORDINATOR_PRELOAD, 'Coordinator +Preload'),
        (PRELOAD, 'Preloader'),
        (BILLING, 'Billing'),
    )
    ...

views.py

from forms import *
    ...
    staff = Staff.objects.all()
    roles = []
    for member in staff:
        form = StaffUserTypeForm(initial=member.user.userprofile.user_type)
        roles.append(form)
    context.update({'staff':staff,'roles':roles})
    ...

模板(这里出错了)

{% for role in roles %}
{{role}}
{% endfor %}

不过这个是可以正常工作的:

{% for member in staff %}
{{member.user.first_name}}
{% endfor %}

更新

这个特定的错误是因为我没有在表单的initial中指定user_type。

应该是:

form = StaffUserTypeForm(initial={'user_type':member.user.userprofile.user_type})

但是,我仍然面临一个问题,就是无法为每个员工输出表单,因为我不能在模板中将变量作为字典的键来引用:

如果:

roles = {}
for member in staff:
  roles[member] = StaffUserTypeForm(initial={'user_type':member.user.userprofile.user_type})

我无法获取特定员工的表单:

{% for member in staff %}
{{roles.member}}
{% endfor %}

这并不奏效,也没有抛出错误。它只是看起来在寻找roles['member'],但这个键并不存在。

1 个回答

1

因为 roles 这个字典里同时包含了成员(作为键)和形式(作为值),那么为什么还要遍历 staff 呢?直接遍历 roles 不就行了吗?

{% for member, form in roles.items %}
    {{ member }} : {{ form }}
{% endfor %}

撰写回答