【问题标题】:How to choose a specific object from a many to many field relationship inside a template in django如何从 django 模板内的多对多字段关系中选择特定对象
【发布时间】:2020-09-03 04:24:23
【问题描述】:

我将一堆项目对象作为变量“项目”传递到我的模板中。 然后我像这样遍历它们:

{% for project in projects %}
    <div class="conflict">
        <h2>{{ project.title }}</h2>
        <div class="conflictdata">
            <p>A conflict with *USER*</p>
            <p>Created on *DATE*</p>
            <p>MORE INFO HERE?</p>
        </div>
    </div>
{% endfor %}

现在项目模型与 Django 用户模型具有多对多的关系(但每个项目只有两个用户)(而每个用户可以有多个项目)。我想做的是从 Project.users 查询集中排除当前登录的 {{user}} 并将其显示在我的模板中(因为那将是当前登录用户与之共享所述项目的用户)。

我怎样才能做到这一点?

如果它有帮助,这也是我的观点:

@login_required
def myconflicts(request):
    form = ProjectForm(request.POST or None)
    if request.method == "POST":
        form = ProjectForm(request.POST)
        if form.is_valid():
            project = form.save()
            project.users.add(request.user)
            project.users.add(User.objects.last())
            return redirect('problemdashboard:problem-dashboard', project_id=project.pk)
            form = NeedForm()
        else:
            form = NeedForm()
    return render(request, 'conflictmanagement/myconflicts.html', {
        'form': form,
        'projects': request.user.project_set.all()
         })

【问题讨论】:

  • 在您的模板中使用 if 条件检查用户名是否与查询集中的用户不匹配。如果匹配,则不打印,否则打印。您可以通过这个if request.user.username访问当前用户名
  • @muhammadhashirhassan 但是我如何在模板中获取查询集才能做到这一点?您能否在答案中给我看一个简单的例子?
  • 能否请您展示您实施多对多的项目模型类,以便我可以据此举个例子?

标签: django


【解决方案1】:

在您的查询集中,而不是 request.user.project_set.all() 使用过滤器。为了满足您的条件,您可能正在寻找否定,因为您希望所有项目除了当前用户,因此您的查询集将如下所示:

from django.db.models import Q # at the start

request.user.project_set.objects.filter(~Q(user.id = request.user.id))

其中 Q 用于否定。我个人没有使用否定过滤器,但它的工作原理是:https://stackoverflow.com/a/1154977/11979793

【讨论】:

  • 这不是我想要的,我想把request.user.project_set的所有项目都传给我的模板,然后在我的模板中打印出我传入的所有项目对象,并为每个项目对象与该项目对象相关的所有用户,不包括当前活动用户。
  • 请展示你的模特课
  • 我自己搞定了,我会回答问题,检查我的答案
【解决方案2】:

我必须简单地在外部 for 循环中遍历该项目的所有用户,然后检查每个用户是否是当前登录的用户,如果不是我打印出来的。

<p>A conflict with {% for currentuser in project.users.all %}
                {% if currentuser != user %}
                {{currentuser}}
                {% endif %}
                {% endfor %}</p>

【讨论】:

  • 太棒了!一个好的编程习惯是只比较唯一键而不是整个对象,例如if currentuser.id = request.user.id,因为比较器只需要比较一个唯一属性而不是所有属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2019-10-25
  • 2020-07-01
  • 1970-01-01
  • 2015-11-16
  • 2021-09-04
  • 2019-07-14
相关资源
最近更新 更多