当我扩展UserAdmin时,在管理面板中收到一个错误(__init __()得到了意外的关键字参数'region']

问题描述 投票:1回答:1

我正在遵循教程https://codingwithmitch.com/courses/building-a-website-django-python/,以使用django 2.2构建用户注册应用。当我想添加一个新用户或在管理面板中修改一个用户时,我的网站工作正常。这是我得到的回溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/admin/account/account/1/change/

Django Version: 2.2.2
Python Version: 3.7.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'phonenumber_field',
 'rest_framework',
 'account']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in wrapper
  606.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\sites.py" in inner
  223.             return view(request, *args, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in change_view
  1637.         return self.changeform_view(request, object_id, form_url, extra_context)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\utils\decorators.py" in _wrapper
  45.         return bound_method(*args, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in changeform_view
  1522.             return self._changeform_view(request, object_id, form_url, extra_context)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in _changeform_view
  1551.         ModelForm = self.get_form(request, obj, change=not add)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\auth\admin.py" in get_form
  80.         return super().get_form(request, obj, **defaults)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in get_form
  669.             fields = flatten_fieldsets(self.get_fieldsets(request, obj))

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\auth\admin.py" in get_fieldsets
  70.         return super().get_fieldsets(request, obj)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in get_fieldsets
  330.         return [(None, {'fields': self.get_fields(request, obj)})]

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in get_fields
  321.         form = self._get_form_for_get_fields(request, obj)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in _get_form_for_get_fields
  659.         return self.get_form(request, obj, fields=None)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\auth\admin.py" in get_form
  80.         return super().get_form(request, obj, **defaults)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in get_form
  705.             return modelform_factory(self.model, **defaults)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\forms\models.py" in modelform_factory
  551.     return type(form)(class_name, (form,), form_class_attrs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\forms\models.py" in __new__
  256.                 apply_limit_choices_to=False,

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\forms\models.py" in fields_for_model
  176.             formfield = formfield_callback(f, **kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\contrib\admin\options.py" in formfield_for_dbfield
  185.                 return db_field.formfield(**kwargs)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\phonenumber_field\modelfields.py" in formfield
  116.         return super().formfield(**defaults)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\db\models\fields\__init__.py" in formfield
  1093.         return super().formfield(**defaults)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\db\models\fields\__init__.py" in formfield
  891.         return form_class(**defaults)

File "C:\Users\IR-Tech\Anaconda3\envs\ArianaSite\lib\site-packages\django\forms\fields.py" in __init__
  214.         super().__init__(**kwargs)

Exception Type: TypeError at /admin/account/account/1/change/
Exception Value: __init__() got an unexpected keyword argument 'region'

这是我的模型。py:

from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class MyAccountManager(BaseUserManager):
    def create_user(self, username, email, first_name, last_name, password=None):
        if not username:
            return ValueError("وارد نمودن شماره تلفن همراه الزامیست")
        if not email:
            return ValueError("وارد نمودن ایمیل الزامیست")
        if not first_name:
            return ValueError("وارد نمودن نام الزامیست")
        if not last_name:
            return ValueError("وارد نمودن نام خانوادگی الزامیست")

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            first_name=first_name,
            last_name=last_name,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, first_name, last_name, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            username=username,
            first_name=first_name,
            last_name=last_name,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class Account(AbstractBaseUser):
    username = PhoneNumberField(verbose_name='شماره تلفن همراه', max_length=15, blank=False, unique=True, region='IR')
    first_name = models.CharField(verbose_name='نام', max_length=15)
    last_name = models.CharField(verbose_name='نام خانوادگی', max_length=40)
    email = models.EmailField(verbose_name='ایمیل', max_length=60, unique=True)
    date_joined = models.DateTimeField(verbose_name='تاریخ ملحق شدن', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='آخرین بازدید', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email', 'first_name', 'last_name', ]

    objects = MyAccountManager()

    def __str__(self):
        return str(self.username) + ', ' + self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

我的管理员:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from account.models import Account


class AccountAdmin(UserAdmin):
    list_display = ('username', 'email', 'date_joined', 'last_login', 'is_admin', 'is_staff')
    search_fields = ('username', 'email',)
    readonly_fields = ('date_joined', 'last_login')

    filter_horizontal = ()
    list_filter = ('is_staff',)
    fieldsets = ()


admin.site.register(Account, AccountAdmin)

我的forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import authenticate
from phonenumber_field.formfields import PhoneNumberField
from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget

from account.models import Account


class RegistrationForm(UserCreationForm):
    username = PhoneNumberField(help_text='این بخش الزامیست. لطفا شماره تلفن همراهتان را وارر نمایید',
                                label='شماره تلفن همراه', region='IR')
    email = forms.EmailField(max_length=60, help_text='این بخش الزامیست. لطفا ایمیاتان را وارر نمایید', label='ایمیل')

    class Meta:
        model = Account
        fields = ('username', 'email', 'first_name', 'last_name', 'password1', 'password2')


class AccountAuthenticationForm(forms.ModelForm):
    username = PhoneNumberField(label='شماره تلفن همراه', widget=PhoneNumberInternationalFallbackWidget, region='IR')
    password = forms.CharField(label='گذرواؤه', widget=forms.PasswordInput)

    class Meta:
        model = Account
        fields = ('username', 'password')

    def clean(self):
        username = self.cleaned_data['username']
        password = self.cleaned_data['password']
        if not authenticate(username=username, password=password):
            raise forms.ValidationError('اطلاعات وارد شده صحیح نمیباشد')

当我将admin.py更改为:

from django.contrib import admin
from account.models import Account


admin.site.register(Account)

它工作正常,但是当我将其更改回原来的状态时,会出现该错误。是我的管理员或模型出现问题吗?

django python-3.x django-models django-admin django-custom-user
1个回答
0
投票

我必须升级到django-phonenumber-field==3.0.1才能解决。

© www.soinside.com 2019 - 2024. All rights reserved.