首页 > 解决方案 > 在一个模板中添加来自不同相关模型的 {{ variable }} 的最简单方法

问题描述

我有一个问题。我想知道在一个模板中添加来自不同相关模型的不同 {{ variable }} 的最简单方法是什么。

我想添加一些与卖家评分相关的信息:

def total_seller_ratings(self):
        return self.seller.rating_seller.count() 
        
def avg_seller_ratings(self):
        return self.seller.annotate(avg_ratesugar=Avg('rating_seller__ratesugar')).order_by('-avg_ratesugar')

从中间件创建模板标签?或者是否有任何快速解决方案可以在我的视图中添加另一个模型?

我的主页有一个主视图:

#Channel MAIN PAGE        
@method_decorator(login_required(login_url='/cooker/login'),name="dispatch")
class ChannelMainPage(generic.DetailView, FormMixin):
    model = Channel
    context_object_name = 'channel'
    template_name = 'channel_detail.html'
    form_class = ChannelChatForm
    
    def get_context_data(self, **kwargs):
        context = super(ChannelMainPage, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def form_valid(self, form):
        if form.is_valid():
            form.instance.channel = self.object
            form.instance.user = self.request.user
            form.save()
            return super(ChannelMainPage, self).form_valid(form)
        else:
            return super(ChannelMainPage, self).form_invalid(form)

    def post(self,request,*args,**kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_valid(form)

    def get_success_url(self):
        return reverse('channel:channel_detail',kwargs={"slug":self.object.slug})

模型.py

class Channel(models.Model):
    consumer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="channel_consumer", blank=True, null=True)
    name = models.CharField(max_length=10)
    seller = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="channel_seller")
    image = models.ImageField(null=True,blank=True,default='user/user-128.png', upload_to='channel/')
    date_created = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField('Make it happen', default=False)

class Rating(models.Model):
    channel = models.OneToOneField(Channel,on_delete=models.CASCADE,related_name="rating_channel")
    consumer = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE,related_name='rating_consumer')
    seller = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE,related_name='rating_seller')
    is_rated = models.BooleanField('Already rated', default=True)
    comment = models.TextField(max_length=200)
    publishing_date = models.DateTimeField(auto_now_add=True)
    ratesugar = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)])
     
    def __str__(self):
        return self.channel.name 

标签: django

解决方案


添加它的一个地方是在 Model 类上。这已经可以作为上下文中的变量使用(参见generic.Detailview.get_context_data)。它被命名为“对象”,然后可以通过模板机制进行访问。

class Channel(models.Model):
    consumer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="channel_consumer", blank=True, null=True)
    name = models.CharField(max_length=10)
    seller = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="channel_seller")
    image = models.ImageField(null=True,blank=True,default='user/user-128.png', upload_to='channel/')
    date_created = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField('Make it happen', default=False)
    
    def some_method():
        pass

模板.html

<div>{{ object.some_method() }}</div>

最后,关于将所需方法放置在哪个模型上的讨论(代码设计)......

  • 如果你想计算它属于模型的所有评级的平均值。User
  • 如果您想要给定频道的收视率平均值,那么它属于Channel模型。

祝你好运。

PS。不要忘记 prefetch_related 以避免慢查询!


推荐阅读