Използвам Django 1.4 с Python 2.7 на Ubuntu 12.04.
Имам шаблон, който искам да попълня с информация относно разработчиците, работещи по проект.
Всеки разработчик ще има следната информация за показване:
type
title
first_name
last_name
skills
Проблемът, с който се сблъсквам, е, че всеки разработчик има много умения, свързани с него.
Създадох модела така:
class DevSkills(models.Model):
dev = models.ForeignKey(User)
skill = models.CharField(max_length = 200)
Опитвам се да създам изглед, който ще попълни речника, така че да мога да преглеждам всеки разработчик, да показвам тяхната информация, след което да преглеждам всяко умение (за да ги покажа един по един).
Ето гледката:
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
Моето намерение е да прегледам всеки разработчик, да създам "супер" речник, който да съдържа всеки от техните user_dict
речници (които са базирани на тяхната User
информация) и да добавя към това речник за всяко от техните умения. След това, обратно в шаблона, искам да превъртя "супер" речника по такъв начин, че да им представи нещо като следното:
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
Виждам ползата от това - всъщност е много по-интуитивно и мисля, че го направих твърде трудно по друг начин. Но моят шаблон все още се показва гол. :(
АКТУАЛИЗАЦИЯ 2:
Знам, че сега съм на път да пиша. Сложих малко регистриране в изгледа:
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
в шаблона. :(