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, потому что после некоторых изменений и попыток он начал работать с точно таким же кодом. Я не знаю, почему поведение не детерминировано в некоторых моментах.

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