Django - MultiValueKeyError в форме при выполнении теста

У меня есть модель CustomUser, использующая django's auth для аутентификации, и пользовательское представление signup. В форме регистрации у меня есть валидация, чтобы проверить, что email_suffix (домен электронной почты) совпадает с district, который они выбирают в форме. Я также проверяю уникальность электронной почты.

При выполнении теста на этом, я получаю ошибку на форме:

raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'district'

Модель

class CustomUser(AbstractUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    is_student = models.BooleanField('student status', default=False)
    is_teacher = models.BooleanField('teacher status', default=False)
    SD23 = 'SD23'
    SD39 = 'SD39'
    SD67 = 'SD67'
    SDISTRICT = [
        (SD23, 'Kelowna SD23'),
        (SD39, 'Vancouver SD39'),
        (SD67, 'Summerland SD67'),
    ]
    district = models.CharField(
        max_length=4, choices=SDISTRICT, blank=True, default='SD39')

    paper = models.BooleanField(default=False)

    def __str__(self):
        return self.username

Вид

def signup(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            to_email = form.cleaned_data.get('email')
            # make the username the same as the email
            user.username = str(to_email)
            user.is_teacher = True
            user.is_staff = True
            user.is_active = False
            user.save()
            group = Group.objects.get(name='teacher')
            user.groups.add(group)
            current_site = get_current_site(request)
            print(urlsafe_base64_encode(force_bytes(user.pk)))
            sendgrid_client = SendGridAPIClient(
                api_key=os.environ.get('SENDGRID_API_KEY'))
            from_email = From("doug@smartmark.ca")
            to_email = To(to_email)
            subject = "Activate your SmartMark Account"
            active_link = render_to_string('account/acc_active_email_link.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })

            html_text = f'Hello {user}<br/><p>Please click on the link below to confirm</p><a href="{active_link}">{active_link}</a>'
            html_content = HtmlContent(html_text)
            mail = Mail(from_email, to_email, subject,
                        html_content)
            response = sendgrid_client.send(message=mail)

            return redirect(reverse('accounts:account_activation_sent'))

    else:
        form = CustomUserCreationForm()
    return render(request, 'account/signup.html', {'form': form})

Форма

class CustomUserCreationForm(UserCreationForm):
    """ form from class based view """
    paper = forms.BooleanField(
        label='I agree that keeping a backup paper gradebook is best practice')
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)

    class Meta:
        model = get_user_model()
        fields = ('email', 'first_name', 'last_name', 'district', 'paper')

    def signup(self, request, user):
        user.district = self.cleaned_data['district']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.paper = self.cleaned_data['paper']
        user.email = self.cleaned_data['email']

    def check_suffix(self, e, d):
        email_domain = e.split("@", 2)[1]
        t_suffix = email_creation(d)[0] # method which takes the 'district' and creates an email suffix
        print(email_domain)
        print(t_suffix)
        if email_domain == t_suffix:
            return True
        else:
            return False

    def clean_email(self):
        value = self.cleaned_data["email"]
        value_district = self.data["district"]
        if not value:
            raise forms.ValidationError('An Email address is required.')
        check_users = CustomUser.objects.filter(email__iexact=value)
        if check_users:
            raise forms.ValidationError('This email is already in use.')
        if value and not check_users:
            if not self.check_suffix(value, value_district):
                self.add_error(
                    "email", "Your email address does not match your school district.")
        return value

метод создания_почты

def email_creation(school_district):
    if school_district == "SD23":
        teacher_suffix = "sd23.bc.ca"
        student_suffix = "learn.sd23.bc.ca"
        email_prefix = True
    elif school_district == "SD39":
        teacher_suffix = "vsb.bc.ca"
        student_suffix = "learn.vsb.bc.ca"
        email_prefix = True
    elif school_district == "SD67":
        teacher_suffix = "sd67.bc.ca"
        student_suffix = teacher_suffix
        email_prefix = True
    return(teacher_suffix, student_suffix, email_prefix)

Тест

def test_signup_endpoint(self):
        email = "foo@vsb.bc.ca"
        result = self.client.post('/accounts/signup/', {'email': email})
        self.assertEqual(result.status_code, 200)
        created_user = get_user_model().objects.get(email=email)
        self.assertTrue(created_user.is_active ==
                        False, created_user.to_dict())

check_suffix может показаться немного запутанным, но MultiValueDictKeyError происходит до вызова этого метода. Похоже, что проблема заключается в `self.data['district'], ему не нравится выбор? Нужно ли мне установить/определить этот выбор/поле в моем тесте? Я попробовал это сделать, добавив в тест следующее, но это не изменило ошибку.

email = "foo@vsb.bc.ca"
district = "SD39"
Вернуться на верх