Django:迭代多对多的关系

时间:2017-06-29 23:03:34

标签: python django

我在我的用户模型和我的项目模型之间创建了多对多关系,我想在用户的个人资料页面上列出特定用户所属的所有项目。

我的模型是:

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")
    ...

Django documentation表示:

  

支持反向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建议但没有成功。因此,您可以帮我解决以下问题吗?

  1. 您可以更新我的 UserDetailView 代码,以便它适用于所有用户吗?
  2. 您能否向我展示我必须在 /user_detail.html 页面上实现的代码(如果我已正确理解它,它应该是一个for循环,遍历<的所有项目) em> Prosjekter 模型,仅列出特定用户所属的模型。)

1 个答案:

答案 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