验证CreateView窗体中的日期时间输入唯一性

2024-10-02 18:15:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个模型,我需要的是时间是唯一的,因为它是一个预订,所以当我创建一个新的预订,我如何检查,如果该时间已经挑选

型号.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()

视图.py

class ReservasCreateView(generic.edit.CreateView):
    model = Reserva
    template_name = 'reservar.html'
    fields = ['horario', 'cancha', 'lote']

预订.html

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Reservar">
</form>

我还有一个疑问,如果我想更改表单中的某些输入类型,我应该保留默认的CreateView并在视图上修改它,还是在forms.py中创建一个自定义表单并将其作为form\u类传递。有什么建议?谢谢


Tags: pyform视图falseautomodelshtml时间
1条回答
网友
1楼 · 发布于 2024-10-02 18:15:03

您可以通过添加以下内容,在数据库级别强制创建保留的日期为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

相关问题 更多 >