【问题标题】:Django modelform NameError: name 'check_in' is not definedDjango modelform NameError:未定义名称'check_in'
【发布时间】:2020-01-17 11:45:24
【问题描述】:

大家好,我是 django 的初学者,正在使用 django3.0 构建一个旅馆预订系统,但我似乎无法让我的模型表单生成正确的查询集来获取我的 Reservations 模型中的数据,我不断收到 NameError 错误每次我尝试通过我的视图输入新日期时都会收到消息,现在我不太确定如何正确解决此错误

这是我的 models.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


now = timezone.now
end = timezone.now() + timezone.timedelta(days=2)
room_choices = [
        ('single_room', 'Single Room'),
        ('double_room', 'Double Room'),
        ('executive_room', 'Executive Room'),
    ]



class Reservation(models.Model):
    room_type = models.CharField(max_length=30, choices=room_choices, default=room_choices[1])
    check_in = models.DateField(default=timezone.now)
    check_out = models.DateField(default=end)

    class Meta:
        verbose_name = 'Reservation'
        verbose_name_plural = 'Reservations'

我想稍后在 views.py 中添加验证语句,以根据用户选择的 room_type 来确定房间的价格和数量,因此暂时忽略该字段

这是我的 forms.py:

from django import forms
from .models import Reservation

class AvailabilityForm(forms.ModelForm):
    class Meta:
        model = Reservation
        fields = [
            "room_type",
            "check_in",
            "check_out",

        ]
        widgets = {
            'check_in': forms.DateInput(format='%m/%d/%Y'),
            'check_out': forms.DateInput(format='%m/%d/%Y'),
        }

如果有人知道如何让小部件在管理员之外正常工作,显示日历 onclick 而不仅仅是内部带有日期字段的字符字段,也请帮我解决这个问题

这是我的 views.py:

from django.shortcuts import get_object_or_404, render
from datetime import timedelta, date
from django.contrib.auth.models import User
from django.contrib import messages
from . import forms
from .models import Reservation 


def availability(request):
    form = forms.AvailabilityForm()
    reservation = Reservation
    if request.method == 'POST':
        form = forms.AvailabilityForm(request.POST or None)
        if form.is_valid:
            reserve = form.save(commit=False)
            reserve.reservation = reservation

            # check whether the dates are valid
            # case 1: a room is booked before the check_in date, and checks out after the requested check_in date
            case_1 = Reservation.objects.filter(check_in__lte=reserve.check_in).filter(check_out__gte=check_in)

            # case 2: oom is booked before the requested check_out date and check_out date is after requested check_out date
            case_2 = Reservation.objects.filter(check_in__lte=check_out, check_out__gte=check_out).exists()

            #case3: room is booked in a date which lies between the two requested check-in/check-out dates
            case_3 = Reservation.objects.filter(check_in__gte=check_in, check_out__lte=check_out).exists()

            # if either of these is true, abort and render the error
            if case_1 or case_2 or case_3:
                return render(request, "availability.html", {"errors": "This room is not available on your selected dates", "form": form})  
            # else dates are valid
            reserve.save()
            messages.add_message(request, messages.SUCCESS, 'Room is available for your stay here')
            return redirect("/complete_booking")
    return render(request, "availability.html", {"form": form})

我尝试了不同的方法来尝试让我的视图验证 check_in 和 check_out 对象,因为您可以看到 case1 和 case2 使用不同的过滤技术,但似乎都不起作用,任何关于我哪里出错的帮助将不胜感激以及如何解决它

【问题讨论】:

  • 在情况 1 中,您没有定义在 .filter(check_out__gte=check_in) 中使用的 check_in
  • @NalinDobhal 你能否再澄清一点我不确定我是否理解我尝试将.filter(check_out__gte=check_in) 更改为.filter(check_out__gte=check_out),但它仍然给我相同的 NameError
  • 首先我希望您添加错误回溯。添加整个回溯。 (请不要图片)
  • @NalinDobhal 回溯太长,无法在此处粘贴它是否有您要查找的某个部分?
  • 其实整个回溯都会有所帮助。它将显示具有正确行号的确切错误。

标签: django django-forms django-views


【解决方案1】:

从cmets,错误是:

File "C:\Users\Karabo\Documents\technocrats2\core\views.py", line 160, in availability 
case_1 = Reservation.objects.filter(check_in__lte=check_in).filter(check_out__gte=check_out).exists()
NameError: name 'check_in' is not defined

检查回溯后,很明显您没有定义任何check_in 变量。使用前需要先定义变量。

check_in = "18-01-2020" # value you want to use in queryset. 
case_1 = Reservation.objects.filter(check_in__lte=reserve.check_in).filter(check_out__gte=check_in)

【讨论】:

    猜你喜欢
    • 2022-10-16
    • 2018-07-14
    • 2017-12-25
    • 2021-07-17
    • 2012-05-13
    • 2017-08-17
    • 2020-02-24
    • 2021-04-14
    • 2020-08-17
    相关资源
    最近更新 更多