Django表单显示用户属性

时间:2017-02-09 17:33:22

标签: python django python-3.x django-forms

我有一个奇怪的问题,我无法解决:当使用包含两个外键属性的表单时,Django不显示任何用户的属性,除了用户名模型。

相关的用户名正确显示,但其他任何属性都没有(名字,姓氏,电子邮件等)。

同样,我在views.py中放置的调试print语句正确地在终端输出中打印用户的属性。

为什么没有任何用户的属性显示在html模板中?

models.py

class UnitGroup(models.Model):
    unit_name = models.CharField(max_length=150, verbose_name='Unit Name')

class UnitUser(models.Model):
    user = models.OneToOneField(User)
    unit = models.ForeignKey(UnitGroup)
    ROLES = ((0, 'Admin'), (1, 'Member'))
    role = models.IntegerField(null=True, blank=True, verbose_name='Role', choices=ROLES)

    def __string__(self):
        return self.user.first_name

forms.py

class UserGroupForm(forms.ModelForm):
    class Meta:
        model = UnitUser
        fields = '__all__'

views.py

from units.forms import UnitForm, UnitDetailsForm, UserGroupForm
from units.models import UnitGroup, UnitDetails, UnitUser
from django.contrib.auth.models import User

def edit_members(request):
    if request.user.is_authenticated() \
            and request.method == 'GET' \
            and 'unit' in request.GET:

        unit_group = request.GET['unit']
        unit_users = UnitUser.objects.filter(unit=unit_group)
        unit_forms = []

        for i in unit_users:

            # debug
            print(i.user.first_name)
            print(i.user.last_name)

            unit_forms.append(UserGroupForm(instance=i))

        return render(request, 'units/edit-members.html', {'unit_forms': unit_forms})

修改-members.html

{% for form in unit_forms %}

    user: {{ form.user }} <br>
    first name: {{ form.user.first_name }}

{% endfor %}

1 个答案:

答案 0 :(得分:1)

您的UserGroupForm是基于UnitUser模型的模型表单。 表单的字段基于模型的字段。

由于UnitUser不包含有关用户的详细信息,而仅包含对用户模型的单个引用,因此用户模型本身仅通过单个字段表示。用户模型的字符串表示形式是用户名。我认为这就是你在表单中看到用户名的原因。

简而言之:您的模型形式将用户视为单个字段,并将使用该字段值的字符串表示形式作为初始值。

如果要在表单中显示用户的更多属性,可能必须为此目的构建特定表单。