我有一个项目模型,用户可以在其中添加项目,该项目具有项目的相关位置。例如,网站将是项目,而Web开发人员将是职位。这是两个型号。
class Project(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='project')
created_at = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=255)
description = models.TextField()
complete = models.BooleanField(default=False)
def __str__(self):
return self.title.title()
class Position(models.Model):
project = models.ForeignKey(Project, default='',related_name='positions')
name = models.CharField(max_length=140)
description = models.TextField()
skill = models.ForeignKey(Skill, default='')
filled = models.BooleanField(default=False)
def __str__(self):
return '{} - {}'.format(self.project.title.title(), self.name.title())
我创建了一个视图,用于显示用户的个人资料以及当前或过去的所有项目。见下文:
class ProfileView(LoginRequiredMixin,generic.TemplateView):
template_name = 'accounts/profile.html'
login_url = settings.LOGIN_REDIRECT_URL
def get_context_data(self, **kwargs):
context = super(ProfileView, self).get_context_data(**kwargs)
lookup = kwargs.get('username')
user = models.User.objects.get(username=lookup)
profile = models.UserProfile.objects.prefetch_related('skills').get(user=user)
context['profile'] = profile
context['skills'] = [skill for skill in profile.skills.all()]
projects = models.Project.objects.all()
context['current_projects'] = projects.filter(Q(owner=user) & Q(complete=False))
context['past_projects'] = projects.filter(Q(owner=user) & Q(complete=True))
return context
我无法弄清楚如何在我的html模板中引用特定项目的位置。我知道如果我尝试使用python shell,我可以查询位置类并获取所有对象,然后从那里获取项目变量。
我试图创建一个位置' context'在这样的观点中:
positions = m.Position.objects.all()
context['positions'] = positions.filter(Q(owner=user)& Q(complete=False))
但是Django并不喜欢那个'所有者'变量 - 我理解,因为我只是从位置抓取数据。我知道在shell中我可以执行m=Position.objects.all()
之类的操作,然后执行m[0].project.title
来获取项目数据。出于某种原因,我无法理解如何将它们放在代码中。任何帮助是极大的赞赏!在这一段时间里,我的脑子已经绞尽脑汁了!
答案 0 :(得分:1)
要遍历相关对象,您可以使用模型的小写名称,后跟__
(2个下划线)和其他模型中的字段名称。
所以不要这样:
positions.filter(Q(owner=user)& Q(complete=False))
像这样写:
positions.filter(Q(project__owner=user) & Q(project__complete=False))