首页 > 解决方案 > 表单函数始终作为有效传递

问题描述

我创建了一个表单和一个视图,用于检查用户的输入lesson_instrument和是否lesson_level与用户对象的值instrument1和匹配level1。该表单旨在通过 iflesson_instrument == instrument1level1 >= lesson_level。但是,无论我在表单中输入什么,表单总是通过有效,它不会失败,即使功能不符合要求。我将非常感谢解决此问题的任何帮助,因为我似乎无法弄清楚出了什么问题。

表格.py

class LessonForm(forms.ModelForm):
    lesson_instrument = forms.ChoiceField(choices=instrument_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
    lesson_level = forms.ChoiceField(choices=level_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
    lesson_length = forms.ChoiceField(choices=length_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
    lesson_day = forms.ChoiceField(choices=day_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
    lesson_time = forms.ChoiceField(choices=time_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
    lesson_weekly = forms.BooleanField(required=False)

    class Meta:
        model = Lesson
        fields = ('lesson_instrument', 'lesson_level', 'lesson_length', 'lesson_day', 'lesson_time', 'lesson_weekly')

    def lesson_allowed(self):
        # Check that the user is allowed to teach that instrument and level
        lesson_instrument = self.cleaned_data.get("lesson_instrument")
        lesson_level = self.cleaned_data.get("lesson_level")

        if lesson_instrument == user.instrument1:
            level1 = user.level1
            if lesson_level == "Beginner":
                lesson_level = 1
                if level1 == 'Beginner':
                    level1 = 1 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level
                if level1 == 'Advanced':
                    level1 = 2 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level
                if level1 == 'Intermediate':
                    level1 = 3 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level 
            if lesson_level == "Advanced":
                lesson_level = 2
                if level1 == 'Beginner':
                    level1 = 1 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level
                if level1 == 'Advanced':
                    level1 = 2 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level
                if level1 == 'Intermediate':
                    level1 = 3 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level 
            if lesson_level == "Intermediate":
                lesson_level = 3
                if level1 == 'Beginner':
                    level1 = 1 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level
                if level1 == 'Advanced':
                    level1 = 2 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level
                if level1 == 'Intermediate':
                    level1 = 3 
                    if level1  >= lesson_level:
                        return lesson_instrument
                        return lesson_level

视图.py

def new_lesson(request):
    if request.method == 'POST':
        form = LessonForm(request.POST)

        if form.is_valid():
            lessons = form.save(commit=False)
            lessons.user = request.user
            lessons.save()
            messages.success(request,'Lesson successfully created')
            return redirect('/teacher/schedule')

        else:
            messages.error(request, 'Information entered was invalid')

    else:
        form = LessonForm()

    lessons = Lesson.objects.filter(user=request.user)
    form = LessonForm(request.POST)
    context = {'form' : form, 'lessons': lessons}
    return render(request, 'teacher/new_lesson.html', context)

标签: pythondjangoforms

解决方案


对于自定义验证,您应该为您的表单定义一个自定义 clean() 方法。请参阅Django 文档中的此部分。看起来这是您尝试对您的方法执行的操作,但是如果它没有通过lesson_allowed,您应该调用它clean()并抛出。forms.ValidationError()


推荐阅读