2017-02-09 49 views
0

我有一个奇怪的问题,我不能补救:当使用包含两个模型之间的外键属性的窗体时,Django不显示任何用户的属性,除了用户名。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}) 

编辑members.html

{% for form in unit_forms %} 

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

{% endfor %} 

回答

1

你UserGroupForm是模型形式的基础上,UnitUser模型。 表单的字段基于模型的字段。

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

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

如果要在表单中显示用户的其他属性,则可能必须为此目的构造特定的表单。

+0

谢谢!我在想它是传递实际的对象而不是字符串表示。我通过放弃模型表单并将模型值传递到网页上的表单来解决此问题,然后将结果传回到views.py中的模型对象中。显然还有更多的工作,但它能完成这项工作。 – Twitch