gpt4 book ai didi

django - 在 Django 模板中显示复杂的字典

转载 作者:行者123 更新时间:2023-12-04 05:27:55 25 4
gpt4 key购买 nike

我在 Ubuntu 12.04 上使用 Django 1.4 和 Python 2.7。

我有一个模板,我想在其中填充有关从事项目的开发人员的信息。

每个开发人员都将显示以下信息:

type
title
first_name
last_name
skills

我遇到的问题是每个开发人员都有许多与他们相关的技能。

我已经创建了这样的模型:
class DevSkills(models.Model):
dev = models.ForeignKey(User)

skill = models.CharField(max_length = 200)

我正在尝试创建一个 View 来填充字典,以便我可以遍历每个开发人员,显示他们的信息,然后遍历每个技能(一次显示一个)。

这是 View :
def developers(request):
"""
.. function:: developers()

Provide the page that shows the developer credentials

:param request: Django Request object
"""
devs = User.objects.filter(is_staff = True)
dev_info = {}
for dev in devs:
dev_info.update(createDevDisplayDict(dev))
data = { 'user' : request.user }
data.update({ 'devs' : dev_info })

return render_to_response("developers.html", data)

我已指定 is_staff字段来自 User表明用户是开发者。

我创建了一个简单的实用程序,可以帮助我填充嵌入式字典,以便我可以遍历它们:
def createDevDisplayDict(user):
"""
.. function:: createDevDisplayDict()

Create a dictionary for showcasing the developer

:param user: developer who we are working with
"""

userProfile = UserProfile.objects.get(user = user)
devSkills = DevSkills.objects.filter(dev = user)
dev_dict = {}
user_dict = { 'dev_type' : userProfile.dev_type,
'title' : userProfile.title,
'first_name' : user.first_name,
'last_name' : user.last_name,
}
dev_dict.update(user_dict)

skill_dict = {}
for skill in devSkills:
skill_dict.upate({ 'skill' : skill.skill })

dev_dict.update(skill_dict)
return dev_dict

我的目的是遍历每个开发人员,创建一个“ super ”字典来包含他们的每个 user_dict字典(基于他们的 User 信息)并为他们的每个技能添加一个字典。然后,回到模板中,我想以这样的方式循环遍历“ super ”字典,以便将它们呈现如下:
James Taylor
Project Lead
Software Developer
• Django
• Python
• JavaScript
• JQuery

Elizabeth Norton
Design Lead
Graphic Designer
• Edge
• Adobe Photoshop
• Adobe Illustrator
• CSS

这是我正在尝试使用的模板:
{% extends "base.html" %}

{% block content %}
<div>
<p>Our Developers</p>
</div>
{% for dev in devs %}
{{ dev.user_dict.first_name }} {{ dev.user_dict.last_name }}
{{ dev.user_dict.title }}
{{ dev.user_dict.dev_type }}

<ul>
{% for skill in dev.skill_dict %}
<li>skill.skill</li>
{% endfor %}
</ul>
{% endfor %}
{% endblock %}

当我现在看到页面时,它看起来像这样:
Our Developers

是的……没有任何东西被填充。有什么建议吗?

更新1:
我已经按照 iMom0 的建议修改了我的实用程序。我现在使用一个列表来包含每个技能。像这样:
def createDevDisplayDict(user):
"""
.. function:: createDevDisplayDict()

Create a dictionary for showcasing the developer

:param user: developer who we are working with
"""

userProfile = UserProfile.objects.get(user = user)
devSkills = DevSkills.objects.filter(dev = user)
dev_dict = {}
user_dict = { 'dev_type' : userProfile.dev_type,
'title' : userProfile.title,
'first_name' : user.first_name,
'last_name' : user.last_name,
}
dev_dict.update(user_dict)

skills = []
for skill in devSkills:
skills.append(skill.skill)

skill_dict = {'skill' : skills}

dev_dict.update(skill_dict)
return dev_dict

我可以看到这样做的值(value) - 事实上,它更直观,我认为我在其他方面做得太难了。但我的模板仍然裸露。 :(

更新 2:

我知道我现在在写路径上。我在 View 中放了一些日志:
devs = User.objects.filter(is_staff = True, is_superuser = False)
dev_info = {}
for dev in devs:
dev_info.update(createDevDisplayDict(dev))

for key in dev_info:
for sub_key in dev_info[key]:
logfile.write('{0} = {1}\n'.format(sub_key, dev_info[key][sub_key]))

并且日志文件显示:
skills = [u'Java', u'Perl', u'C++', u'Python', u'Django']
dev_type = Software Developer
first_name = Rico
last_name = Cordova
title = Owner

所以,它必须是我在模板中调用它的一种方式,对吗?

更新 3:

我意识到我正在断开 user_dict和他们的 skills .所以我稍微修改了这个实用程序,将它们整合到一个字典中。
## Create a logging object
userProfile = UserProfile.objects.get(user = user)
devSkills = DevSkills.objects.filter(dev = user)
dev_dict = {}
user_dict = { 'dev_type' : userProfile.dev_type,
'title' : userProfile.title,
'first_name' : user.first_name,
'last_name' : user.last_name,
}

skills = []
for skill in devSkills:
skills.append(skill.skill)

user_dict.update({ 'skills' : skills })

dev_dict['user_dict'] = user_dict
return dev_dict

在我看来,这是一个更好的解决方案。我仍然无法访问 user_dict虽然模板中的信息。 :(

最佳答案

您可以使用 Django 的 ORM 功能来使这更容易(并且,我们会看到,获得更好的性能),这是一个很棒的功能!

型号代码

class DevSkill(models.Model):
dev = models.ForeignKey(UserProfile, related_name = 'skill_set')
skill = models.CharField(max_length = 200)

我们改变了两件事:
  • 使用 UserProfile ForeignKey而不是用户将简化其余的代码。既然你有 UserProfile <-> User无论如何映射,这不会成为问题。
  • 我们添加了一个 related_name属性,以便任何 UserProfile对象现在有一个 skill_set存储它的列表的属性 DevSkills .

  • (请注意 related_name 不是必需的,如果你不设置它,Django 将创建一个通用的 modelname_set 属性)。
    另外, DevSkill应该是单数,对象是单技能!

    我也希望您对 UserProfile 有以下内容,并假设你做了代码。如果你不适应,你就需要适应。
    class UserProfile(models.Model):
    user = models.OneToOneField(User)
    title = models.CharField(max_length = 40)
    dev_type = # W/E you want

    在 View 中:
    devs = UserProfile.objects.all() # Or W/E queryset would fit.
    # Pass context & all.

    在模板中:
    {% extends "base.html" %}

    {% block content %}
    <div>
    <p>Our Developers</p>
    </div>
    {% for dev in devs %}
    {{ dev.user.first_name }} {{ dev.user.last_name }}
    {{ dev.title }}
    {{ dev.dev_type }}

    <ul>
    {% for skill in dev.skill_set.all %}
    <li>skill.skill</li>
    {% endfor %}
    </ul>
    {% endfor %}
    {% endblock %}

    性能

    请注意,此代码(不过,您现在也在使用的代码)绝对会降低性能。事实上,我们正在为每个用户做几个查询(为他们的用户和他们的 DevSkills 查询数据库)。

    不过这不是问题,我们可以使用 ORM 的 select_related prefetch_related 解决该问题的功能:
    devs = UserProfile.objects.select_related('user').prefetch_related('skill_set').all()这样,我们只做两个查询,一个针对 UserProfile -> User一个用于 DevSkill 's,它的连接是在 Python 中完成的,但你不应该关心这个,Django 会为你完成。

    请注意 prefetch_related是 Django 1.4 的特性。

    脚注: UserProfile东西在 Django 1.5 中消失了,看看吧!

    关于django - 在 Django 模板中显示复杂的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989560/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com