Я использую 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
в шаблоне. :(