我在我的用户模型和我的项目模型之间创建了多对多关系,我想在用户的个人资料页面上列出特定用户所属的所有项目。
我的模型是:
class User(auth.models.User,auth.models.PermissionsMixin):
def __str__(self):
return "@{}".format(self.username)
class Prosjekter(models.Model):
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
...
users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, verbose_name="Project participants")
...
支持反向m2m查询(即,从没有ManyToManyField的表开始):
>>> Publication.objects.filter(article__id=1)
<QuerySet [<Publication: The Python Journal>]>
我可以通过键入来打印特定用户的QuerySet(此处以主键为2的用户进行说明):
class UserDetailView(generic.DetailView):
model = User
template_name = 'accounts/user_detail.html'
results = Prosjekter.objects.filter(users__pk=2),
print(results)
这将返回:
(<QuerySet [<Prosjekter: Project 1>, <Prosjekter: Project two>, <Prosjekter: Project third>]>,)
但是,正如您所看到的,我只会呼叫主键为 2 的用户。相反,我想创建一个可以在一般意义上使用的视图。具体来说,我可以看到:
我是Python和Django的新手,无法创建此视图。在许多其他尝试中,我尝试遵循this建议但没有成功。因此,您可以帮我解决以下问题吗?
答案 0 :(得分:0)
您使用DetailView
错误:
class UserDetailView(generic.DetailView):
model = User
template_name = 'accounts/user_detail.html'
def get_context_data(self, **kwargs):
ctx = super(UserDetailView, self).get_context_data(**kwargs)
ctx['results'] = Prosjekter.objects.filter(users=self.get_object())
return ctx
如果您需要更多上下文变量,请按以下方式添加:
def get_context_data(self, **kwargs):
ctx = super(UserDetailView, self).get_context_data(**kwargs)
ctx.update({
'results': Prosjekter.objects.filter(users=self.get_object()),
'foo': 'bar',
'spam': 'ham',
})
return ctx