Django test factory post с внешним ключом
Я пытаюсь протестировать view-функцию с пост-методом django RequestFactory
. Функция view-функции должна создать новый ObjA
-инстанс. ObjA
имеет поле внешнего ключа к ObjB
.
В настоящее время мой тест выглядит следующим образом (имена изменены для лучшего восприятия):
request = self.factory.post('/create-objA/', data={'objB': objB.id, 'field1': 'dummy'})
request.user = self.user
request.POST.is_bound = True
create_objA(request)
self.assertTrue(ObjA.objects.filter(field1='dummy').exists())
objB
существует, это проверяется несколькими строками ранее в той же тестовой функции.
Однако тест в этом фрагменте не работает. Причина в том, что в следующей функции создания form.is_valid()
никогда не true
:
def create_objA(request):
if request.method == 'POST':
form = ObjAFormCreate(request.POST)
if form.is_valid():
....
Поэтому ObjA
не создается. Форма не действительна, так как имеет ошибку в поле ссылки ObjB
:
Select a valid choice. That choice is not one of the available choices.
хотя objB.id
находится внутри form.data
.
Вопрос: Как мне написать тест, чтобы form
не было ошибки?
Модель:
class ObjA(models.Model):
id = models.BigAutoField(primary_key=True)
obj_b_id = models.ForeignKey(ObjB, on_delete=models.CASCADE)
field1 = models.CharField(max_length=10)
Форма:
class ObjAFormCreate(ModelForm):
objB = forms.ModelChoiceField(queryset=ObjB.objects.all())
field1 = forms.CharField(max_length=10)
Отвечаю на свой вопрос. Похоже, что код правильный и есть ошибка либо в Django, либо в моей IDE, потому что после некоторых изменений и попыток он начал работать с точно таким же кодом. Я не знаю, почему поведение не детерминировано в некоторых моментах.