如何从 Django 中的特定表单中获取字段 class?

How to fetch a field class from a specific form in Django?

我正在尝试为用户名字段编写测试,我想使用 SimpleTestCase.assertFieldOutput()。问题是我无法从我的表单字段中获取字段类:

import django
from django.test import TestCase

    class UserRegistrationTest(TestCase):
    """Tests for the user registration page."""

    def test_username_field(self):
        data = {'username': 'павел25',
                'password1': 'njkdpojv34',
                'password2': 'njkdpojv34',
                'email': 'pav294@mail.ru',
                'first_name': 'Pavel',
                'last_name': 'Shlepnev'}
        f = RegistrationForm(data)
        self.assertFieldOutput(f.fields['username'], {'pavel25': 'pavel25'}, {'павел25': ['Имя пользователя должно содержать только символы ASCII.']})

当我 运行 测试它引发 TypeError: 'UsernameField' object is not callable

这是访问表单数据的方式:

form_data = f.cleaned_data
username = form_data['username']

等等

包装在 type() 函数中似乎有效。它给了我一个 class 对象,这是我在 SimpleTestCase.assertFieldOutput().

fieldclass 参数中需要的对象
>>> type(f.fields['username'])
<class 'django.contrib.auth.forms.UsernameField'>

测试运行没有错误并产生有效输出:

import django
from django.test import TestCase

class UserRegistrationTest(TestCase):
"""Tests for the user registration page."""

    def test_username_field(self):
        data = {'username': 'павел25',
                'password1': 'njkdpojv34',
                'password2': 'njkdpojv34',
                'email': 'pav294@mail.ru',
                'first_name': 'Pavel',
                'last_name': 'Shlepnev'}
        f = RegistrationForm(data)
        self.assertFieldOutput(type(f.fields['username']), {'pavel25': 'pavel25'}, {'павел25': ['Имя пользователя должно содержать только символы ASCII.']})
    ======================================================================
    FAIL: test_username_field (accounts.tests.UserRegistrationTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "C:\Users\pavel\source\repos\Speak the Truth\accounts\tests.py", line 43, in test_username_field
        self.assertFieldOutput(type(f.fields['username']), {'pavel25': 'pavel25'}, {'павел25': ['Имя пользователя должно содержать только символы ASCII.']})
      File "C:\Users\pavel\source\repos\Speak the Truth\env\lib\site-packages\django\test\testcases.py", line 760, in assertFieldOutput
        required.clean(input)
    AssertionError: ValidationError not raised

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