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)

Вернуться на верх