【问题标题】:Django templates: if .. inDjango 模板:如果 .. 在
【发布时间】:2020-12-30 18:51:08
【问题描述】:

我有一个产品列表并希望在模板中显示它们,具体取决于产品的经销商是否为当前登录用户“所有”。所以这是我的看法:

class ArticleListView(ListView, LoginRequiredMixin):
    template_name = "accounts/list_article_quentin.html"
    model = Product
    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context["website"] = Website.objects.first()
        context["product_list"] = context["product_list"].filter(published=True)
        # Get a list of all dealers associated to the current users.
        currentUserDealers = self.request.user.dealers.all().values_list('id', flat=True)
        context["current_user_dealers"] = list(currentUserDealers)
        return context

所以 currentUserDealers 是与当前用户关联的经销商列表(经销商和用户之间是多对多关系)。

这是产品和经销商模型(仅相关部分):

class Product(models.Model, CloneMixin):
    published = models.BooleanField(null=True,blank=True, default=False)
    title = models.CharField(null=True,blank=True,max_length=100)
    subtitle = models.CharField(null=True,blank=True,max_length=200)
    (...)
    dealer = models.ManyToManyField(Dealer, null=True,editable=True,related_name="product_to_dealer")
    (...)
    # Not sure what this does:
   _clone_many_to_many_fields = ['parameter', 'tag', 'category', 'dealer','images']
    (...)

    
class Dealer(models.Model, CloneMixin):
    dealer_check = models.ForeignKey("self",null=True, blank=True, on_delete=models.SET_NULL)
    published = models.BooleanField(null=True,blank=True, default=True)
    (...)
    users = models.ManyToManyField(User,null=True,blank=True, related_name='dealers')
    (...) 

在我的模板中,我想做类似的事情来决定是否展示产品:

{% if product.dealer.all.0.pk in current_user_dealer %}

(一个产品可以有多个经销商,但我稍后会看到,因此是 all.0)

显然这不起作用,但你明白了,我想看看当前产品的经销商 ID 是否在当前用户的关联经销商列表中,看看我们是否显示它。在模板中执行此操作的语法是什么?或者也许有更好的方法可以直接在视图中执行此操作?

【问题讨论】:

  • 你能展示你的模型吗?
  • @SLEm 我用模特编辑了我的帖子!
  • 那么一个产品可以有多个经销商吗?我不明白这个逻辑,但会尽力帮助,给我几分钟
  • 是的,但目前它有点被忽略了,这就是为什么我只选择第一个。谢谢!
  • 只需使用ForeignKey,然后我的回答将 100% 有效

标签: python sql django django-templates backend


【解决方案1】:

此查询应该会在您的模板中为您提供正确的 product_list

def get_context_data(self):
    context = super(ArticleListView, self).get_context_data(**kwargs)
    context['product_list'] = Product.objects.filter(dealer__id_in=self.request.user.dealers.all())
    return context

【讨论】:

  • 我必须在 get_context_data() 参数中添加 **kwargs,然后出现此错误:相关字段查找无效:​​id_in
  • 如果你想让它工作你需要把它变成一个ForeignKey关系,如果那不是你的代码库那么你应该问拥有它的人来做它,它不工作的原因是因为在查询中,dealer 是一个 m2m 字段和一个 m2m 字段关系没有单个 id,它们存储查询集,但是 ForeignKey 关系会这样做,如果您替换该部分它将起作用
  • 顺便说一句,我稍微修改了查询,所以你可以试试
  • 谢谢,我会谈论它,但我认为我们的目标是让它与可以在某个时候销售相同产品的多个经销商合作。我尝试了您编辑的版本,但仍然收到“相关字段查找无效:​​id_in”
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多