【问题标题】:How to loop through extended user model fields in Django template?如何遍历 Django 模板中的扩展用户模型字段?
【发布时间】:2019-01-21 15:22:15
【问题描述】:

我用 Profile 模型扩展了 Django 的用户模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    date_of_birth = models.DateField()
    address = models.CharField(max_length=300)
    postcode = models.CharField(max_length=15)

然后,我通过这个视图将这些数据传递到模板中:

def profile(request):
    args = {'user': request.user}
    return render(request, 'users/profile.html', args)

然后我可以在模板中单独访问 Profile 模型的每个字段:

<p>Your DOB is: {{ user.profile.date_of_birth }}</p>

但是,我想用一个 for 循环来表示:

{%for field in Profile model %}
    <p>{{field name}} = {{field value}}
{% endfor %}

但是我尝试了很多不同的方法,但没有一个有效,例如

{% for field in user.profile.all %}
    <p>{{ field }}</p>
{% endfor %}

(这会编译,但在运行模板时为空)

【问题讨论】:

  • 它不会“编译”,模板错误通常会被忽略,你的Profile 对象没有all 属性。请参阅重复的问题。您将无法直接在模板中执行此操作,但应该能够使用给定的解决方案在上下文中传递字段名称和字段值的列表。

标签: python django django-models django-templates django-views


【解决方案1】:

使用model_to_dict 将您的实例转换为python dict

from django.forms.models import model_to_dict

def profile(request):
   profile = model_to_dict(request.user.profile)
   return render(request, 'users/profile.html', {'profile':profile})

现在您可以在模板中访问您的个人资料字段:

# items is a python dictionary method to return key/value pair.
{% for field, value in profile.items %} 
    <p>{{ field }} = {{ value }}</p>
{% endfor %}

【讨论】:

  • @TerminalGuy 如果您有任何疑问,请告诉我。 :)
  • 成功了!很抱歉这么久才回复您,非常感谢!
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2019-07-14
  • 1970-01-01
  • 2012-10-02
  • 2018-05-24
  • 2019-10-22
相关资源
最近更新 更多