Django 模板 - 如何 运行 变量上的方法?
Django templates - how to run a method on a variable?
我是 Django 的新手,所以我的尝试可能纯粹是异端邪说 ;)
我正在尝试制作一个视图,其中列出了不可靠的会议室及其属性,包括可用性。
我有 2 个模型:Room
和 Reservation
。我希望在视图中有一个列说明在页面显示当天房间是否可用。
我的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 %}
我是 Django 的新手,所以我的尝试可能纯粹是异端邪说 ;)
我正在尝试制作一个视图,其中列出了不可靠的会议室及其属性,包括可用性。
我有 2 个模型:Room
和 Reservation
。我希望在视图中有一个列说明在页面显示当天房间是否可用。
我的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 %}