django - 在一个模板中添加来自不同相关模型的 {{ 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
解决方案
添加它的一个地方是在 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 以避免慢查询!
推荐阅读
- c - 升级到 Python3 - C 数据类型
- google-cloud-platform - 将 Google AutoML API 与 API KEY 连接时出错
- angular - 注册调整大小的事件
- react-native - 子组件样式不起作用,但是当我将代码保存在子组件中时,然后在热重载样式后将其应用于子组件
- sql - 使用单独的 where 子句优化从同一个表查询连接 3 次
- python - 在 python 中编辑日期时间格式(使用 datetime.strptime)
- java - Java中的父子参数化构造函数
- matplotlib - matplotlib plot 在 streamlit 中的分辨率很差
- java - 从openj9堆驼峰获取字节数组数据
- java - 如何使用 XmlJsonParser 将信息从 java 保存和读取到 XML?