Django: представление не помещает значение, возвращаемое функцией - PullRequest
0 голосов
/ 08 мая 2019

У меня есть представление bookingrecordsView, в котором я получаю все бронирования, сделанные пользователем. Я добавил модельную функцию is_pending(), которая выбирает экземпляр резервирования, проверяет, прошло ли поле date_to или нет, и возвращает строку. Вид, который выбирает бронирования:

def bookingrecordsView(request):
    rsv = Reservation.objects.filter(user=request.user)
    return render(request, 'booking_history_page.html', {'rsv': rsv})

И функция, которая проверяет дату:

class Reservation (models.Model):
    ....
    ​@property
    Def is_pending(self):
        if self.date_to < datetime.date.today():
            return "Pending"
        else:
            return "Over"

Это мой шаблонный фрагмент:

{% for r in rsv %}
  <tr>
    <td>{{ r.id }}</td>
    <td>{{ r.date_from }} - {{ r.date_to }}</td>
    <td>{{ r.time_from }} - {{ r.time_to }}</td>
    <td>{{ r.chosen_vehicle }}</td>
    <td>{{ r.garage }}</td>
    <td>{{ r.destination }}</td>
    <td>{{ r.is_pending }}</td>
  </tr>
{% endfor %}

Теперь, для всех бронирований, даже прошедших месяцами ранее, этот status всегда возвращает «Ожидание».

Как получить правильное возвращаемое значение для каждого Reservation экземпляра из функции is_pending() и передать его соответственно в шаблон?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Почему так сложно?

class Reservation(models.Model):
    ...
    @property
    def is_pending(self):
        return self.date_to < datetime.date.today()

Избавьтесь от этой функции и укажите это свойство как обычное поле в вашем шаблоне. Как это:

{{ r.is_pending }}

Вы можете изменить эту функцию, чтобы она возвращала описание статуса или реализовывать его (преобразование в «ожидающий», «поверх») в шаблоне.

0 голосов
/ 08 мая 2019

Вы не рассматриваете каждую оговорку должным образом, вместо этого вы хотите сделать что-то более похожее на это:

def bookingrecordsView(request):
    rsv = Reservation.objects.filter(user=request.user)
    condition = checkIfPending(rsv)
    return render(request, 'booking_history_page.html', {'rsv': rsv})

checkIfPending функция

def checkIfPending(rsv):
    for r in rsv:
        if r.date_to < datetime.date.today():
            r.status = "Pending"
        else:
            r.status = "Over"

И шаблон

{% for r in rsv %}
  <tr>
    <td>{{ r.id }}</td>
    <td>{{ r.date_from }} - {{ r.date_to }}</td>
    <td>{{ r.time_from }} - {{ r.time_to }}</td>
    <td>{{ r.chosen_vehicle }}</td>
    <td>{{ r.garage }}</td>
    <td>{{ r.destination }}</td>
    <td>{{ r.status }}</td>       <-- Placed 'status' here
  </tr>
{% endfor %}

В качестве альтернативы, вы можете также определить метод status в вашей модели Reservation, к которому вы можете получить прямой доступ с помощью r.status или аналогичным.Это позволит избежать необходимости повторять все резервирования только для установки этого значения.

...