【问题标题】:How To Make Every Fifth Post An Ad Post In Django如何在 Django 中使每五个帖子成为广告帖子
【发布时间】:2021-04-17 10:33:07
【问题描述】:

我正在尝试允许用户赞助帖子,以便为帖子带来更多点击。我想让每第五个帖子成为赞助帖子,但如果我尝试在模板中使用除以并循环浏览广告,那么它将在第四个帖子之后发布所有广告

这是我尝试过的一些代码

编辑:我已将问题更改为不会显示帖子的内容,有人可以告诉我我哪里错了吗?

型号:

class Ads(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)

观看次数:

def home(request, pk):
    
   post_list = []
   ad_list = []
   for p in Post.objects.all():
       post_list.append(p.Post) 
   for a in Ads.objects.all():
       ad_list.append(p.Ads) 
   n = 5
   iter1 = iter(post_list)
   post_ad_list = []
   for x in ad_list:
       post_ad_list.extend([next(iter1) for _ in range(n - 1)])
       post_ad_list.append(x)
   post_ad_list.extend(iter1)

   context = {
       'posts': post_ad_list,
   }
return render(request, 'new.html', context)

我尝试过但不起作用的模板:

{% for item in posts %}

    //prints products and ads

   
{% endfor %}

【问题讨论】:

标签: django django-views django-templates


【解决方案1】:

好的,因此您可以枚举您的 Post 查询集,以便您可以每 x 个对象插入一个广告。这将是一种冗长且易于理解的方法。

或者你可以用来自itertoolschain做一些像这样的事情;

>>> N = 5  # element to insert ad
>>> k = 'Ad'  # Thing added to the list
>>>
>>> list(chain(*[letters[i : i+N] + [k] if len(letters[i : i+N]) == N else letters[i : i+N] for i in range(0, len(letters), N)]))
['a', 'b', 'c', 'd', 'e', 'Ad', 'f', 'g', 'h', 'i', 'j', 'Ad', 'k', 'l']

如您所见,每 5 个元素添加一个“广告”。

如果您将两个查询集转换为列表,您可以使用ads.pop() 将元素插入到帖子列表中。

【讨论】:

  • 谢谢,您能否告诉我是否需要从 Ads.objects.all() 进行更改,因为模型 Ads 的帖子由于某种原因不会在模板中打印出来,我认为原因是 Ads.objects.all()
  • 好吧,Ads.objects.all() 只会给你所有的广告,所以如果你没有看到任何广告,那就表明你没有任何广告。
  • 我已经通过 django 管理员添加了它们,但它们不会出现。我想也许我需要做一些像 Ads.posts 之类的事情
  • 好吧,您可以获得与Post 相关联的广告,因为您有 FK,但如果您仅每 5 个帖子展示一个广告,则它不会是与每个帖子相关联的广告邮政。具体如何运作完全取决于您。
【解决方案2】:

我假设您可以使用相同的模板代码来打印帖子和广告。因此,明智的做法是不要将太多逻辑放入模板中,而是将其转移到视图中。

按照this 之类的方法,根据自己的喜好组合两个列表/查询集。

然后,像在模板中那样显示组合列表的元素(假设新创建的列表称为 products_and_ads:

{% for item in products_and_ads %}
  {# print the stuff you want #}
{% endfor %}

当然,您现在还可以添加某种指示符,表明它是广告(您肯定应该这样做)。但由于这可以通过多种方式完成(包括在标题中,布尔值,...),这取决于您。

【讨论】:

  • 我尝试了一些东西并将其添加到我的问题中,你能告诉我将对象附加到列表中的错误在哪里
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2018-02-18
相关资源
最近更新 更多