python - 在 Django 模板的“if”语句中调用外键关系
问题描述
我有两个模型,预订和确认,它们通过“预订”通过外键关系相关联。我只想在我的详细视图中显示属性值为 is_confirmed ==True 的预订。我真的不需要查询集,如果模板中的确认为 True,我只想显示“预订”模型中的预订信息。
模型.py:
class Booking(models.Model):
user = models.ForeignKey(CustomUser, null=True, default='', on_delete=models.CASCADE)
expert = models.ForeignKey(CustomUser, null=True, default='',on_delete=models.CASCADE, related_name='bookings')
title = models.CharField(max_length=200, default='Video call with ..', null=True)
start_time = models.DateTimeField('Start time', null=True)
end_time = models.DateTimeField('End time', null=True)
notes = models.TextField('Notes', blank=True, null=True)
class Meta:
verbose_name = 'Booking'
verbose_name_plural = 'Bookings'
def get_absolute_url(self):
return reverse('booking:booking_detail', kwargs={"pk": self.pk})
class Confirmation(models.Model):
booking = models.ForeignKey(Booking, on_delete=models.CASCADE)
expert_confirming = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
is_confirmed = models.BooleanField(default=False)
def get_absolute_url(self):
return reverse('booking:booking_detail', kwargs={"pk": self.booking_id})
视图.py:
class BookingDetailView(DetailView):
model = Booking
template = 'templates/booking_detail.html'
booking_detail.html:
<div class="container" id="booking_content">
<p>{{ booking.title }}</p>
<p>{{ booking.start_time }}</p>
<p>Booking request by: {{ booking.user }}</p>
<p>Expert requested: {{ booking.expert }}</p></div>
我不确定模板中的 if 语句应该如何引用这些相关模型来显示我想要的。
解决方案
我认为,按照您拥有模型的方式,您必须在 Confirmation 模型上运行查询以确定是否存在特定预订的确认。但是为什么有一个单独的确认模型呢?尝试将相关字段移动到预订模型中:
class Booking(models.Model):
user = models.ForeignKey(CustomUser, null=True, default='', on_delete=models.CASCADE)
expert = models.ForeignKey(CustomUser, null=True, default='',on_delete=models.CASCADE, related_name='bookings')
title = models.CharField(max_length=200, default='Video call with ..', null=True)
start_time = models.DateTimeField('Start time', null=True)
end_time = models.DateTimeField('End time', null=True)
notes = models.TextField('Notes', blank=True, null=True)
is_confirmed = models.BooleanField(default=False) # just this field since you already have an expert.
这简化了事情,并减少了您的数据库的负载。然后,您可以仅显示使用此模板语言确认的预订:
{% if booking.is_confirmed %}
<div class="container" id="booking_content">
<p>{{ booking.title }}</p>
<p>{{ booking.start_time }}</p>
<p>Booking request by: {{ booking.user }}</p>
<p>Expert requested: {{ booking.expert }}</p>
</div>
{% else %}
...
{% endif %}
您可能有充分的理由使用单独的确认模型。如果是这样,那么这个答案是无关紧要的。如果没有,那么也许这可以帮助您简化事情。
推荐阅读
- neural-network - ConvNets 中的每个卷积都会增加维数吗?
- python - numpy,取它们交集的数组差
- java - 将图像上传到 Firebase
- android - 拇指图像略位于拇指左侧
- c# - Xamarin.Forms TimePicker 是否支持行为?
- python-3.x - 导入张量流时出错。DLL 加载失败
- android - 是否可以强制 AlertDialog 的按钮始终垂直显示?
- bash - Bash 脚本更改目录不返回这样的文件或目录
- swift - 如何在 Core Data 托管对象上跟踪“发送到实例的无法识别的选择器”
- android - Android ListView 回复其值