Django - получение параметров init в чистый метод в форме
У меня есть модель с уникальной совокупностью, и я хочу проверить это условие в моей форме модели. Уникальная совокупность включает поле, которое передается форме в методе init, пользователя и поле, которое находится в форме. У меня проблемы с тем, чтобы первые два поля попали в чистый метод для валидации.
Мои первые попытки не увенчались успехом, и я нашел этот пост, но не смог заставить его работать в моей ситуации: Как получить запрашиваемого пользователя в чистой функции в django forms?
модель:
class Objective(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
objective_name = models.CharField(max_length=10)
description = models.CharField(max_length=300)
mode = models.CharField(max_length=2, default='LA')
class Meta:
unique_together = ['user', 'objective_name', 'course']
ordering = ['objective_name']
def __str__(self):
return self.objective_name
Вид:
def addobjective(request, course_id):
this_course = get_object_or_404(Course, pk=course_id)
user = request.user
all_courses = Course.objects.filter(user=user)
objective_list = Objective.objects.filter(
course=this_course).order_by('objective_name')
context = {'objective_list': objective_list}
if request.method == 'POST':
form = ObjectiveForm(request.POST, my_course=this_course)
if form.is_valid():
obj = form.save(commit=False)
obj.course = this_course
obj.user = user
obj.save()
form = ObjectiveForm(my_course=this_course)
context['form'] = form
return redirect('gradebook:addobjective', course_id=this_course.id)
else:
form = ObjectiveForm(my_course=this_course)
context['form'] = form
context['this_course'] = this_course
context['all_courses'] = all_courses
return render(request, 'gradebook/objective-form.html', context)
Форма:
class ObjectiveForm(ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
my_course = kwargs.pop('my_course')
super(ObjectiveForm, self).__init__(*args, **kwargs)
class Meta:
model = Objective
fields = ('objective_name', 'description', 'mode',)
def clean(self):
cleaned_data = super().clean()
user = self.request.user
objective_name = cleaned_data.get("objective_name")
my_course = self.my_course
description = cleaned_data.get("description")
mode = cleaned_data.get("mode")
if Objective.objects.filter(course=my_course, objective_name=objective_name).count() > 0:
del cleaned_data["objective_name"]
del cleaned_data["description"]
del cleaned_data["mode"]
raise forms.ValidationError(
"This course already has a learning objective with this name.")
return self.cleaned_data
Две ошибки, которые я получаю при этом:
'NoneType' object has no attribute 'user'
и 'ObjectiveForm' object has no attribute 'my_course'
Да, поле my_course не определено в модели Objective, поэтому, возможно, вам нужно изменить эту строку:
form = ObjectiveForm(request.POST, my_course=this_course)
To
form = ObjectiveForm(request.POST, course=this_course)