python - 表单函数始终作为有效传递
问题描述
我创建了一个表单和一个视图,用于检查用户的输入lesson_instrument
和是否lesson_level
与用户对象的值instrument1
和匹配level1
。该表单旨在通过 iflesson_instrument == instrument1
和level1 >= 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)
解决方案
对于自定义验证,您应该为您的表单定义一个自定义 clean() 方法。请参阅Django 文档中的此部分。看起来这是您尝试对您的方法执行的操作,但是如果它没有通过lesson_allowed
,您应该调用它clean()
并抛出。forms.ValidationError()
推荐阅读
- java - 获取 Android 上每个核心的当前 cpu 使用情况
- python - 如何在 Odoo Docker 中关闭 TCP 连接
- javascript - 从一个模型中获取层并将其分配给另一个模型
- python-3.x - 有没有办法将纯色背景扩展到页面的整个宽度以获取 matplotlib 子图中的标题?
- java - 嵌入在 Spring MVC/Rest 中的 React 应用程序:浏览器 GET 请求路由
- php - Laravel:检索属于帖子的类别名称而不是category_id
- php - 将 PHP 和 MySQL 创建的 CSV 保存到服务器
- html - 带有居中图标的 Angular Material mat-nav-list 多行
- android - Jenkins CI/CD 无法发布到 Android Playstore
- sql - 仅选择非空列值并使用 sql 查询仅显示该值