使用来自中间表的信息从manydomanyfield中检索用户列表

问题描述 投票:1回答:1

自从我尝试使用中间表的信息检索用户列表以来已经过了几个小时。

所以我有一个工作区模型,它是一个多用户的用户

还有一个中间表来区分经典用户和工作区管理器

我想显示用户列表并添加一个小图标,表示列表中的管理器。

但不幸的是,Django似乎很难用中间表的信息显示工作区的用户列表。

在任何情况下,我看看Django的文档,我没有设法找到该怎么做。

models.朋友

class Workspace(models.Model):
    name = models.CharField(max_length=250, verbose_name="Nom du workspace")
    members = models.ManyToManyField(User, through='Membership', verbose_name="Membres du workspace")
    token = models.CharField(max_length=500)    # token statique
    join_token = models.CharField(max_length=500)   # token dynamique
    join_token_date = models.DateTimeField(auto_now_add=False, null=True, blank=True)
    payday = models.DateField(max_length=10, verbose_name="Jour de paye", null=True, blank=True)
    planning_image = ProcessedImageField(upload_to='planning',
                                                null=True, 
                                                blank=True,
                                                processors=[ResizeToFill(1299, 937)],
                                                format='JPEG',
                                                options={'quality': 100})
    planning_thumbnail = ImageSpecField(source='planning_image',
                                        processors=[ResizeToFill(280, 202)],
                                        format='JPEG',
                                        options={'quality': 100})

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('create-workspace')


class Membership(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    workspace = models.ForeignKey(Workspace, on_delete=models.CASCADE)
    is_manager = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)

views.朋友

@login_required
def workspace_detail(request, token):

    ins_workspace = get_object_or_404(Workspace, token=token)
    list_members = ins_workspace.members.all()

    for member in list_members:
        if member == request.user:
            current_user = Membership.objects.get(workspace=ins_workspace, user=request.user)
            context = {
                        'name': ins_workspace.name,
                        'token': ins_workspace.token,
                        'list_members': list_members,
                        'payday': ins_workspace.payday,
                        'is_manager': current_user.is_manager,
                        }
            return render(request, 'workspace/workspace_detail.html', context)
        else:
            return HttpResponseForbidden()

template.html

{% for item in list_members %}
   {{ item.username }}
{% endfor %}

这就是我要的:

template.html

{% for item in list_members %}
   {% item.is_manager %}
      {{ item.username }} (♔)
   {% else %}
      {{ item.username }}
{% endfor %}
django python-3.x manytomanyfield
1个回答
1
投票

你可以这样做:

使用相关名称更新成员资格模型

class Membership(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="membership")
    workspace = models.ForeignKey(Workspace, on_delete=models.CASCADE)
    is_manager = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)

然后您可以更新您的视图,如下所示:

from django.db.models import F

@login_required
def workspace_detail(request, token):

    ins_workspace = get_object_or_404(Workspace, token=token)
    list_members = ins_workspace.members.all().annotate(is_manager=F('membership__is_manager'))

    context = {
            'name': ins_workspace.name,
            'token': ins_workspace.token,
            'list_members': list_members,
            'payday': ins_workspace.payday,
            'is_manager': request.user.membership.get(workspace=ins_workspace).is_manager,
     }
     return render(request, 'workspace/workspace_detail.html', context)

这应该够了吧。

我在这里做的是,我使用a reverse relation从会员模型中获取is_manager值。我使用F在查询集中注释该值。

© www.soinside.com 2019 - 2024. All rights reserved.