определил класс Form, но django вызвал исключение, сказав, что он не определен - PullRequest
0 голосов
/ 29 октября 2019

Следуйте инструкциям на странице . настроить профиль пользователя при использовании django-allauth. Django / python говорит, что не может найти определение класса «RegistrationForm», которое четко определено в файле forms.py в приложении пользователя, как в приведенном ниже коде. Кто-нибудь знает, что происходит?

forms.py

from django import forms
from allauth.account.forms import AddEmailForm, BaseSignupForm
from django.core.exceptions import ValidationError
from django.conf import settings
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class SignupForm(BaseSignupForm):
    first_name = forms.CharField(max_length=30, label='Firstname')
    last_name = forms.CharField(max_length=150, label='Lastname')

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

class MyAddEmailForm(AddEmailForm):
    def clean_email(self):
        email = super().clean_email()
        if self.user.emailaddress_set.count() >= settings.USERS_EMAILS_MAX_COUNT:
            raise ValidationError('Number of related emails can be no more than %d.' % settings.USERS_EMAILS_MAX_COUNT)
        return email

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = (...)

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = (...)

Сообщение об ошибке:

  File "D:\Python\Django\m4ever\users\admin.py", line 4, in <module>
    from .forms import CustomUserCreationForm, CustomUserChangeForm
  File "D:\Python\Django\m4ever\users\forms.py", line 3, in <module>
    from allauth.account.forms import AddEmailForm, BaseSignupForm
  File "C:\Users\Freedom\Anaconda3\envs\myvenv\lib\site-packages\allauth\account\forms.py", line 261, in <module>
    class BaseSignupForm(_base_signup_form_class()):
  File "C:\Users\Freedom\Anaconda3\envs\myvenv\lib\site-packages\allauth\account\forms.py", line 249, in _base_signup_form_class
    fc_classname))
django.core.exceptions.ImproperlyConfigured: Module "users.forms" does not define a "SignupForm" class

1 Ответ

0 голосов
/ 30 октября 2019

Заподозрил, что это связано с проблемой кругового импорта. Немного изменил код, как показано ниже, и проблема исчезла. Два изменения:

  1. RegistrationForm теперь наследуется от обычных форм. Форма вместо allauth.account.forms.BaseSignupForm

  2. Moved "allauth. account.forms import AddEmailForm "с начала файла, прямо перед тем, как это было необходимо.

Все еще хотел бы, чтобы эксперты по Python и / или Django-Allauth точно разъяснили, что произошло.

from django import forms
from django.core.exceptions import ValidationError
from django.conf import settings
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class SignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, label='Firstname')
    last_name = forms.CharField(max_length=150, label='Lastname')

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

from allauth.account.forms import AddEmailForm
class MyAddEmailForm(AddEmailForm):
    def clean_email(self):
        email = super().clean_email()
        if self.user.emailaddress_set.count() >= settings.USERS_EMAILS_MAX_COUNT:
            raise ValidationError('Number of related emails can be no more than %d.' % settings.USERS_EMAILS_MAX_COUNT)
        return email

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = (...)

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = (...)
...