【问题标题】:Django form to display user attributesDjango 表单显示用户属性
【发布时间】:2017-06-27 20:22:48
【问题描述】:

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

关联的用户名显示正确,但其他属性均未显示(名字、姓氏、电子邮件等)。

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

为什么用户的任何属性都没有显示在 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})

edit-members.html

{% for form in unit_forms %}

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

{% endfor %}

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!我在想它传递的是实际对象而不是字符串表示形式。我通过放弃模型表单并将模型值传递到网页上的表单中,然后将结果传递回views.py中的模型对象来解决这个问题。显然还有更多的工作,但它确实完成了工作。
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多