我有这个模型,我需要的是唯一的时间,因为它是一个保留,所以当我创建一个新的保留时,如何检查该时间是否已经选择。
models.py
class Reserva(models.Model):
horario = models.DateTimeField(auto_now_add=False, auto_now=False)
cancha = models.ForeignKey('Cancha', on_delete=models.CASCADE)
lote = models.IntegerField()
views.py
class ReservasCreateView(generic.edit.CreateView):
model = Reserva
template_name = 'reservar.html'
fields = ['horario', 'cancha', 'lote']
reservation.html
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Reservar">
</form>
还有一个疑问,如果我想更改表单中的某些输入类型,我应该保留默认的CreateView并在视图上进行修改,还是在Forms.py中创建自定义表单并将其作为form_class传递。推荐什么?谢谢
答案 0 :(得分:0)
您可以通过添加以下内容来强制在数据库级别创建保留日期为unique
:
horario = models.DateTimeField(unique=True)
或者,您可以覆盖form_valid()
方法,以检查是否选择了日期并引发异常或您想要的任何事情:
from django.contrib import messages # better than raising an exception
from app_name import models # import your APP models
class ReservasCreateView(generic.edit.CreateView):
model = Reserva
template_name = 'reservar.html'
fields = ['horario', 'cancha', 'lote']
success_url = 'YOUR_SUCCESS_URL'
def form_valid(self, form):
date = form.cleaned_data.get('horario', None)
# check if the date is unique
# If we find the same date stored in the database
# we'll add a message to be rendered into the template
dates = models.Reserva.objects.filter(horario=date).first()
if dates:
messages.error(self.request, "This current date is not unique!")
return super().form_valid(form)
然后在您的模板中,可以像以下示例一样添加消息框架:
{% for message in messages %}
{{ message }}
{% endfor %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Reservar">
</form>
有关更多信息,您可以访问django official documentation