Django test a modelform - ValidationError not a valid UUID
Я тестирую форму модели и получаю ошибку ValidationError. Моя модель, представление и тест выглядят следующим образом:
модель
class Course(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
course_name = models.CharField(max_length=30)
grade_level = models.CharField(max_length=4, default="SEC")
view
@ method_decorator([login_required, teacher_required], name='dispatch')
class CourseUpdateView(PermissionRequiredMixin, UpdateView):
raise_exceptions = True
permission_required = 'gradebook.change_course'
permission_denied_message = "You don't have access to this."
model = Course
fields = ['course_name', 'grade_level', ]
template_name_suffix = '_update'
def get_success_url(self, *args, **kwargs):
return reverse('gradebook:coursedetail', kwargs={'course_pk': self.object.pk})
form
class CourseForm(ModelForm):
class Meta:
model = Course
fields = ('course_name', 'grade_level',)
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.qc = Course.objects.filter(user=user)
def clean(self):
super(CourseForm, self).clean()
course_name = self.cleaned_data.get('course_name')
if course_name and self.qc.filter(course_name__iexact=course_name).exists():
raise ValidationError("A course with that name already exists.")
if len(course_name) > 20:
if len(course_name) > 10:
raise ValidationError(
"Your course name cannot be longer than 20 characters")
return self.cleaned_data
Тест
class CourseUpdateTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.user = CustomUser.objects.create_user(
username='tester',
email='tester@email.com',
password='tester123',
is_teacher=True,
is_active=True,
)
cls.user.save()
def test_CourseUpdate_valid(self):
request = HttpRequest()
request.POST = {
'user': self.user,
'id': '4d192045-07fa-477f-bac2-5a99fe2e7d46',
'course_name': "Science",
'grade_level': "SEC"
}
form = CourseForm(request.POST)
self.assertTrue(form.is_valid())
Ошибка, которую я получаю:
Raise exceptions.ValidationError(
django.core.exceptions.ValidationError: ["“{'user': <CustomUser: tester>, 'id': '4d192045-07fa-477f-bac2-5a99fe2e7d46', 'course_name': 'Science', 'grade_level': 'SEC'}” is not a valid UUID."]
Я пробовал не вводить id в request.POST
, но получаю ту же ошибку.
Изначально я пытался проверить правильность формы с помощью:
def test_CourseUpdate_valid(self):
form = CourseForm(data={
'user': self.user,
'id': '4d192045-07fa-477f-bac2-5a99fe2e7c04',
'course_name': "Science",
'grade_level': "SEC"
},)
self.assertTrue(form.is_valid())
Однако это не сработало, выдав ошибку TypeError: __init__() missing 1 required positional argument: 'user'
Ваше первоначальное решение было неудачным, потому что в функции form init отсутствовал позиционный аргумент user
.
Во-вторых, ваш класс CourseForm
должен указать остальные поля (id
и user
), если вы хотите передать их форме.
Вы, вероятно, можете просто не передавать id
и user
в данные CourseForm
в тесте, поскольку они не имеют значения.
Это должно работать:
def test_CourseUpdate_valid(self):
form = CourseForm(self.user, data={
'course_name': "Science",
'grade_level': "SEC"
},)
self.assertTrue(form.is_valid())
Можете ли вы попробовать это и сообщить мне, если проблема сохранится?