Как обновить объект модели при тестировании UpdateView Django

У меня возникают некоторые проблемы, когда я тестирую представление обновления в моем коде.Вот представление:

class PatientUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
    permission_required = 'main.change_patient'
    model = Patient
    template_name = 'patient/edit_patient.html'
    form_class = PatientUpdateForm

А это модель пациента:

class Patient(models.Model):
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False
    )
    first_name = models.CharField(max_length=50, blank=False)
    last_name = models.CharField(max_length=50, blank=False)
    middle_name = models.CharField(max_length=50, blank=True, default='')
    hospital_number = models.IntegerField(unique=True, default=0)

    age = models.IntegerField(blank=False)
    sex = models.CharField(max_length=6, choices=gender_choices, default='female')
    weight = models.CharField(max_length=10, choices=gender_choices, default='female')

    def __str__(self):
        return f' {self.hospital_number} --> {self.first_name}  {self.last_name}'

    def get_absolute_url(self):
        return reverse('patient_detail', args=[str(self.id)])

Вот форма:

class PatientUpdateForm(forms.ModelForm):
    def __init__(self,  *args, **kwargs):
        super(PatientUpdateForm, self).__init__(*args, **kwargs)
        gender_choices = [
            ('male', 'Male'),
            ('female', 'Female')
        ]

        marriage_choices = [
            ('married', 'Married'),
            ('single', 'Single')
        ]
        self.fields['gender'] = forms.ChoiceField(choices=gender_choices)
        self.fields['marriage_status'] = forms.ChoiceField(choices=marriage_choices)

    class Meta:
        model = Patient
        fields = [
        'first_name', 'last_name', 'hospital_number',
        'age', 'sex', 'weight'
    ]

И тестовый пример:

class PatientsTest(TestCase):
    def setUp(self):
        self.superuser = get_user_model().objects.create_user(
             email='genuis@gmail.com',
             username='supergenius',
             password='password',
             is_superuser = True
        )

    def test_patient_update_view(self):
        data = {
            'first_name':'Joe',
            'sex' :'female',
            }

        new_patient = Patient.objects.create(
            first_name='John',
            last_name = 'doe',
            hospital_number = 2,
            age=24,
            sex = 'male',
            weight='79 Kg',
        )

        self.client.login(username=self.superuser.username, password='password')
        response = self.client.post(reverse('patient_edit', kwargs={'pk': new_patient.id}), data)
        self.assertEqual(response.status_code, 302) # should go through for superusers, response code should be 302 but returns 200
        new_patient.refresh_from_db()
        self.assertEqual(new_patient.first_name, 'Joe')
        self.assertEqual(new_patient.sex, 'female')
        self.client.logout()

Тест завершается неудачей со следующим сообщением:

FAIL: test_patient_update_view (main.tests.PatientsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/app/main/tests.py", line 109, in test_patient_update_view
    self.assertEqual(new_patient.first_name, 'Joe')
AssertionError: 'John' != 'Joe'
- John
+ Joe

----------------------------------------------------------------------

Это означает, что поля, указанные в data, не обновляются. Я попробовал указать значения для всех полей в базе данных, как было предложено в этом посте , но это все равно не сработало. Представление обновления работает нормально, когда я тестирую его в браузере. Как я могу решить эту проблему?

Кроме того, response.status_code возвращает 200 вместо 302 (происходит перенаправление на детальное представление), есть ли какие-либо предположения, почему это так? Спасибо.

Я наконец-то нашел решение. Установка всех значений для модели Patient перед публикацией решила проблему. Ранее мне не удавалось задать значение для middle_name, потому что я указал значение по умолчанию в модели базы данных. Вот обновленная функция test_patient_update_view:

def test_patient_update_view(self):
        data = {
            'first_name':'Joe',
            'middle_name': 'Jack',
            'last_name':'Doe',
            'sex' :'female',
            'hospital_number':2,
            'age':24,
            'sex':'male',
            'weight':'79 Kg', 
            }

        new_patient = Patient.objects.create(
            first_name='John',
            last_name = 'doe',
            hospital_number = 2,
            age=24,
            sex = 'male',
            weight='79 Kg',
        )

        self.client.login(username=self.superuser.username, password='password')
        response = self.client.post(reverse('patient_edit', kwargs={'pk': new_patient.id}), data)
        self.assertEqual(response.status_code, 302) 
        new_patient.refresh_from_db()
        self.assertEqual(new_patient.first_name, 'Joe')
        self.assertEqual(new_patient.sex, 'female')
        self.client.logout()

Теперь response.status_code также возвращает 302.

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