Reputation:
I created a form and a view that checks if a user's input, lesson_instrument
and lesson_level
, match the user object's values of instrument1
and level1
. The form is intended to pass if lesson_instrument == instrument1
, and level1 >= lesson_level
. However, no matter the input I put in the form, the form always passes as valid, it doesn't fail, even when the function does not meet the requirements. I would greatly appreciate any help in solving this issue as I can't seem to figure out what's wrong.
forms.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
views.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)
Upvotes: 0
Views: 21
Reputation: 2084
For custom validation, you should define a custom clean() method for your form. See this section in the Django docs. It looks like this is what you're attempting to do with your lesson_allowed
method, but you should call it clean()
and throw forms.ValidationError()
if it does not pass.
Upvotes: 2