Вызов отношения внешнего ключа в операторе if в шаблоне Django - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть две модели, Бронирование и Подтверждение, которые связаны через отношения ForeignKey через «бронирование».Я хочу, чтобы в моем подробном представлении отображались только те заказы, которые имеют значение атрибута is_confirmed == True.Я на самом деле не хочу набор запросов, я просто хочу отобразить информацию о бронировании из модели «Бронирование», если в шаблоне подтверждено значение «Истина».

models.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})

views.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 в шаблоне должно ссылаться на эти связанные модели для отображения того, что я хочу.

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, что при наличии ваших моделей вам нужно будет выполнить запрос к модели подтверждения, чтобы определить, существует ли подтверждение для определенного бронирования.Но зачем вообще иметь отдельную модель подтверждения?Попробуйте просто переместить соответствующее поле в модель бронирования:

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 %}

У вас может быть веская причина для использования отдельной модели подтверждения.Если так, то этот ответ не имеет значения.Если нет, то, возможно, это поможет вам упростить ситуацию.

...