Django 模板 - 如何 运行 变量上的方法?

Django templates - how to run a method on a variable?

我是 Django 的新手,所以我的尝试可能纯粹是异端邪说 ;)

我正在尝试制作一个视图,其中列出了不可靠的会议室及其属性,包括可用性。 我有 2 个模型:RoomReservation。我希望在视图中有一个列说明在页面显示当天房间是否可用。

我的models.py:

from django.utils import timezone
from django.db import models


class Room(models.Model):
    name = models.CharField(max_length=255, unique=True)
    capacity = models.IntegerField()
    projector = models.BooleanField()


class Reservation(models.Model):
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    date = models.DateField()
    comment = models.CharField(max_length=255)

    class Meta:
        unique_together = ('room', 'date',)

我的views.py:

class ShowRoom(View):
    def get(self, request):
        rooms = Room.objects.all()
        time_now = timezone.now().date()
        context = {
            'rooms': rooms,
            'time_now': time_now
        }
        return render(request, 'rooms/list_rooms.html', context)

我的模板:

{% extends 'rooms/base.html' %}

{% block block_title %} Home {% endblock %}

{% block block_content %} 
{% if rooms %}

    <table  class="table">
        <thead>
            <td> Name </td>
            <td> Capacity </td>
            <td> Available </td>
            <td> Projector </td>
        </thead>
        <tbody>
    {% for room in rooms|dictsort:'capacity'  %}
        <tr>
            <td>  <a href="{% url 'rooms:detail_room' room_pk=room.pk %}">{{ room.name }}</a>  </td>
            <td> {{ room.capacity }} </td>
            <td>  Available? </td>
            <td> {{ room.projector|yesno:'yes,no' }} </td>
            
        </tbody>
    {% endfor %}
</table>
{% else %}
    <h1> You have no registered rooms yet. </h1>
{% endif  %}
{% endblock %}

一切正常,我只需要用代码替换此 <td> Available? </td> 行,该代码将根据现有房间预订显示“免费”或“已入住”。

我发现也许我应该写一个自定义过滤器。

这是我的过滤器:

from django import template 
from rooms.models import Room, Reservation

register = template.Library()


@register.filter
def check_reservation(queryset, now):
    return queryset.filter(date=now)

(我想先让它工作,然后让它显示这个“空闲”或“占用”。)

我已经添加到模板 {% load my_extras %} 并将我要更改的行替换为

<td>  {{ room.reservation_set.all|check_reservation:'time_now' }} </td>

输出为:

ValidationError at /room/ ["'time_now' value has an invalid date format. It must be in YYYY-MM-DD format."]

在添加过滤器之前,我在 shell 中尝试了这个解决方案并且它有效。

不知道是不是过滤器出了问题,还是我尝试从错误的角度来解决问题。

提前感谢任何提示。

尝试向房间添加另一个字段 class:

occupied = model.BooleanField(default=False)

在视图中,您可以查看与预订相关的日期和今天的日期。

if reservation.date == time_now:
  room.occupied = true

然后您可以筛选可用和不可用的房间。

rooms_occupied = room.objects.filter(occupied=True)
rooms_available = room.object.filter(occupied=False)

在模板中:

{% if rooms_occupied %}
  Available
{% endif %}