Django:视图未放置函数返回的值

时间:2019-05-08 15:11:01

标签: django django-templates django-views

我有一个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 个答案:

答案 0 :(得分:1)

为什么这么复杂?

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

摆脱该功能,并将此属性作为模板中的常规字段引用。像这样:

{{ r.is_pending }}

您可以更改此功能以使其返回状态描述或在模板中实现(转换为“待处理”,“结束”)。

答案 1 :(得分:0)

您没有适当考虑每个预订,而是想做更多类似的事情:

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或类似方法直接访问该方法。这样可以避免只为设置此值而遍历所有保留。