3

I have start_time and end_time data fields in models and I want to assign an error when start_time is later than end_time.

forms.py

class RentForm(forms.ModelForm):
    class Meta:
        model = Rent
        fields = ['start_time', 'end_time']
    def clean(self):
        cleaned_data = super().clean()
        start_date = cleaned_data.get("start_time")
        end_date = cleaned_data.get("end_time")
        if start_time > end_time:
            raise forms.ValidationError("Error")

views.py

def rent_car(request):
    if request.method == 'POST':
        form = RentForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        form = RentForm(request.POST)
    return render(request, 'rent.html', {'form': form)

Unfortunately, I get an error

unsupported operand type(s) for -: 'NoneType' and 'NoneType'

Please help me solve this problem.

4

1 回答 1

1

您以错误的方式使用表格。如果您创建要渲染的表单(暂时),则不应使用RentForm(request.POST),因为那时您已经将值存储在表单中。此外,使用request.POST也不是一个好主意,因为如果没有 POST 参数,POST 请求有时可能是完全有效的。因此,您应该将视图重写为:

def rent_car(request):
    if request.method == 'POST':
        form = RentForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        form = RentForm()
    return render(request, 'rent.html', {'form': form)

您可能还想在您的 中设置start_time和,并且您必须返回以防表格无效:end_timeRentFormcleaned_data

class RentForm(forms.ModelForm):
    start_time = forms.DateTimeField(required=True)
    end_time = forms.DateTimeField(required=True)

    class Meta:
        model = Rent
        fields = ['start_time', 'end_time']

    def clean(self):
        cleaned_data = super().clean()
        start_date = cleaned_data.get('start_time')
        end_date = cleaned_data.get('end_time')
        if start_time > end_time:
            raise forms.ValidationError("Error")
        return cleaned_data
于 2019-09-08T18:15:36.833 回答