在扩展了优秀的django项目django-profiles(在https://bitbucket.org/ubernostrum/django-profiles/wiki/Home上找到)后,我偶然发现了一些我几天试图解决的问题。
这个想法很简单。我有用户,其中包含用户配置文件(对象UserProfile,链接到User)。现在我在我的项目Employment中添加了一个新对象,它也链接到User对象。
class Employment(models.Model):
"""
A class to describe the relationship of employment, past or present, between an employee and an organization.
"""
def __unicode__(self):
return self.function
def get_absolute_url(self):
return "/recycling/employment/%i/" % self.id
user = models.ForeignKey(User)
organization = models.ForeignKey(Organization)
date_start = models.DateField('Start date of employment', help_text="Please use the following format: YYYY-MM-DD.", null=True, blank=True)
date_end = models.DateField('End date of employment', help_text="Please use the following format: YYYY-MM-DD.", null=True, blank=True)
function = models.CharField(max_length=100)
present_job = models.BooleanField()
class UserProfile(models.Model):
"""
A class representing a the profile of a user. Needs to be generic enough to involve both employees as employers.
"""
def _get_absolute_url(self):
return ('profiles_profile_detail', (), { 'username': self.user.username })
# Link person to user
user = models.ForeignKey(User, unique=True, null=True)
registration_date = models.DateField(auto_now_add=True)
现在我想有一个页面(详细视图),我可以在其中显示UserProfile以及特定用户的所有工作。 我认为添加extra_context是可行的方法,例如:。
('^profiles/(?P<username>\w+)/$', 'profiles.views.profile_detail', {'extra_context': {'employment_list': Employment.objects.all(),}}),
然而,我面临的问题是我想拥有特定于用户的对象(因此过滤)而不仅仅是所有()。 一个缺陷是django-profiles项目仍然使用函数作为视图而不是类,因此子类化不是一个选项。另一个注意点是视图不应该被缓存,因此如果用户添加另一个就业对象并被重定向到详细信息页面,则应该反映此更改。 如果不改编django-profiles代码本身就找到一个解决方案会很好...
感谢您的帮助!
找到了这样做的方法,结果证明相当简单。我创建了一个新视图,它生成一个带过滤器的列表。将extra_context中的此列表传递给配置文件应用程序中定义的视图并完成...
def detail_userprofile_view(request, username):
"""
Returns a detail view including both the User Profile and the Employments linked to the user.
"""
employment_list = Employment.objects.filter(user__username=username)
context_dict = { 'employment_list': employment_list,}
return profile_detail(request, username, extra_context=context_dict)
答案 0 :(得分:0)
你总是可以写一个新视图。简单的事情:
网址
url(r'^profiles/(?P<username>\w+)/$', profiles.views.profile_detail, name='profile_detail'),
视图
def profile_detail(request, username):
context_dict = {}
user = get_object_or_404(User, username=username)
profile = get_object_or_404(Profile, user=user)
employment = get_object_or_404(Employment, user=user)
context_dict = { 'user': user,
'profile':profile,
'employment':employment,
}
return render_to_response('details.html', context_dict, RequestContext(request))
现在,您可以在模板中{{ user.first_name }}
或{{ profile }}
或{{ employment.organization }}
等等...