Юнит-тестирование Django для ProfileEditForm с отключенными (только для чтения) полями

Я хочу написать модульные тесты для моей формы ProfileEditForm, которая имеет некоторые поля с disabled=True. Эти поля доступны только для чтения и не могут быть изменены. Я хочу протестировать эту логику. Насколько я знаю, мне не нужно передавать форме поля disabled. Форма сама проверяет эти поля.

models.py

class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=63, blank=False)
    last_name = models.CharField(max_length=63, blank=False)
    about_me = models.CharField(max_length=511, blank=True)

forms.py

class ProfileEditForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = [
            "username",
            "email",
            "first_name",
            "last_name",
            "about_me",
        ]

    username = forms.CharField(label="Username", disabled=True)
    email = forms.EmailField(label="Email", disabled=True)
    first_name = forms.CharField(label="First Name", max_length=63, required=False)
    last_name = forms.CharField(label="Last Name", max_length=63, required=False)
    about_me = forms.CharField(label="About Me", max_length=511, required=False)

tests.py

class ProfileEditFormTests(TestCase):

    def setUp(self) -> None:
        self.user = get_user_model().objects.create_user(username="testuser",
                                                         email="test@test.com",
                                                         password="password123")
        self.profile = Profile.objects.create(user=self.user)

    def test_email_field_is_not_editable(self):

        form_data = {
            "username": self.profile.user.username,
            "email": self.profile.user.email,
            "first_name": "first",
            "last_name": "last",
            "about_me": "",
        }
        form = ProfileEditForm(data=form_data)
        self.assertTrue(form.is_valid())

Я получаю:

AssertionError: False is not true

Когда я распечатываю ошибки формы с print(form.errors):

<ul class="errorlist"><li>username<ul class="errorlist"><li>This field is required.</li></ul></li><li>email<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

Даже если я указываю все поля, форма все равно недействительна.

    form_data = {
        "username": self.profile.user.username,
        "email": self.profile.user.email,
        "first_name": "first",
        "last_name": "last",
        "about_me": "",
    }

Я получаю ту же ошибку Ничего не меняется.

Во время теста я проверяю, успешно ли создан экземпляр Profile с помощью Profile.objects.count(). Ответ положительный.

Для примера: я использую общий UpdateView для редактирования профилей пользователей с помощью ProfileEditForm. Представление и форма работают хорошо.

Как писать модульные тесты для полей, доступных только для чтения?

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