【问题标题】:How do I get django template to recognize manytomanyfield comparison?如何让 django 模板识别多域比较?
【发布时间】:2019-01-23 22:07:33
【问题描述】:

在我的项目中,我目前正在尝试访问多对多字段并将其与另一个字段进行比较。我有几个案例我正在做类似的事情并且它正在工作。这种情况下的不同之处在于,我试图从本质上说,如果这个多对多字段中的一个值等于另一个多对多字段中的一个值,那么就做点什么......

这是我的代码...

Book(models.Model):
    publisher = models.ManyToManyField(Name)

Userprofile(models.Model):
    publisher = models.ManyToManyField(Name)

在我的 Django 模板中,我正在尝试执行类似...

{% If user_publisher in form.initial.publisher_set.all %} 
{{ publisher.name }}
{% endif %}

上面的示例是我正在尝试做的简化版本....我实际上是在尝试比较多对多字段,如果任何值匹配,则执行操作。我今天大部分时间都在这样做,并尝试了几种组合。

如果我做类似的事情

{% if user in form.initial.publisher.all %}

这很好用。我正在努力尝试找出如何比较许多字段。我怀疑用户查询工作正常,因为它不是一个多字段。

我认为我的格式已关闭。我尝试将 _set 用于发布者和用户发布者,当我打印输出时,我实际上看到 user_publisher 和发布者查询集是相同的。但是,我的 django 模板没有显示任何结果。提前感谢您的任何想法。

我整个下午都在 SO 和 Google 上冲浪,但不知道我做错了什么。

这里是我的问题的更多细节。我目前正在执行 CreateView,我试图通过覆盖 get_initial 来获取现有记录,如下所示:

class BookUpdateView(CreateView):
    model = Book 
    form_class = Book
    template_name = 'Book/update_book.html'

    def get_initial(self):
        initial = super(BookUpdateView, self).get_initial()
        book = Book.objects.get(pk=self.kwargs["pk"])
        initial = book.__dict__.copy()

        initial.update({
             "publisher": publisher.all(),
        })
        return initial

因为我将这些记录作为起点进行复制,并且这是一个 CreateView,所以我还没有 PK 或 ID 可以从 get_context_data 角度进行查询。不知道如何获取我正在复制但尚未保存的数据。我实际上是想弄清楚用户是否通过他们的用户个人资料拥有相同的发布者,并且能够找出 get_context_data 的格式,如下所示:

def get_context_data(self, **kwargs):
    context = super(BookUpdateView, self).get_context_data(**kwargs)
    user_publisher = self.request.user.userprofile.publisher.all()
    return context  

我试图做类似......

{% if user_publisher in form.initial.publisher_set.all %} 

但是模板永远不会承认这两个实际上是匹配的......

当我打印变量时......

他们都显示...

<QuerySet [<Publisher: ACME Publishing>]>
<QuerySet [<Publisher: ACME Publishing>]>

但模板无法识别它们是相同的。使用上面的模板语言时,屏幕没有像我预期的那样呈现。没有错误,但最终结果也不是我所期望的。提前感谢您提供任何其他想法。

【问题讨论】:

  • 为什么不在视图函数中做比较呢?
  • @truecam 感谢您的建议。我尝试使用模板语言的原因是因为我正在将另一条记录中的数据复制到此 CreateView 中,并且似乎也无法使用 get_initial 获取数据。我可以复制数据,但是当我尝试将一个多对多字段与另一个进行比较时,它不起作用。
  • 您是否遇到任何模板错误?
  • 为什么不尝试遍历作者集并检查每个作者是否都在发布者集中?
  • @truecam 我已经用更多细节更新了我原来的问题。我没有收到任何错误,并且我正在努力迭代上述发布者数据。感谢您的宝贵时间。

标签: django python-3.x django-forms django-templates many-to-many


【解决方案1】:

经过一两天的思考,我能够弄清楚如何获取 PK,然后在上下文中使用它,这样我就可以通过上下文而不是直接利用表单来利用信息。

def get_context_data(self, **kwargs):
        context = super(UpdateProcedureView, self).get_context_data(**kwargs)
        pk=self.kwargs["pk"]
        publisher = Publisher.objects.filter(pk=pk).filter(individual_access=self.request.user).count()
        return context

然后我可以在表单中说 if publisher > 0 then do something fancy。感谢一路上的建议,帮助我思考这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2018-09-25
    • 2021-08-25
    • 2011-04-17
    • 2019-01-19
    • 2012-06-06
    相关资源
    最近更新 更多