0
이메일 (Django 1.7 Python 3.4 사용)을 통해 사용자 모델을 만들려고합니다. 관리자 클래스로 사용자 정의 사용자 모델을 만들었습니다. 하지만 내가 오류 받고 있어요 장고 관리자 패널에서 사용자 인스턴스를 편집하기 위해 노력하고있어 때/관리/계정// 1/ 'AccountForm'개체가 어떤 속성이없는 '수'AttributeError 'AccountForm'객체에 'get'속성이 없습니다.
계정에서AttributeError를
Django 모델 API로 문제없이 사용자 데이터를 수정할 수 있습니다. 문제는 관리자 패널에서만 나타납니다. Traceback은 이메일 필드에서 뭔가 잘못되었지만 실제로는 무엇인지 깨닫습니다.
/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/forms/widgets.py in value_from_datadict
return attrs
def value_from_datadict(self, data, files, name):
"""
Given a dictionary of data and this widget's name, returns the value
of this widget. Returns None if it's not provided.
"""
return data.get(name, None) ...
def id_for_label(self, id_):
"""
Returns the HTML ID attribute of this Widget for use by a <label>,
given the ID of the field. Returns None if no ID is available.
▼ Local vars
Variable Value
name
'email'
data
<django.forms.widgets.AccountForm object at 0x7f19280790b8>
files
{}
self
<django.contrib.admin.widgets.AdminEmailInputWidget object at 0x7f1928039a58>
내 코드 :
models.py:
class AccountManager (BaseUserManager) :
''' '''
def _create_user (self, email, password, is_staff = False, is_superuser = False, **extra_fields) :
''' Creates a User with given email and password '''
now = timezone.now()
if not email :
raise ValueError('wrong email')
email = self.normalize_email(email)
user = self.model(email = email, is_staff = is_staff, is_superuser = is_superuser,
last_login = now, date_joined = now, **extra_fields)
user.set_password(password)
user.save(using = self._db)
return user
def create_user (self, email, password = None, **extra_fields) :
''' '''
return self._create_user(email, password = None, **extra_fields)
def create_superuser (self, email, password, **extra_fields) :
''' '''
return self._create_user(email, password, is_staff = True, is_superuser = True, is_admin = True, **extra_fields)
class Account (AbstractBaseUser, PermissionsMixin) :
''' Custom user account inherits from both AbstractBaseUser and PermissionsMixin '''
email = models.EmailField(max_length = 255, unique = True, db_index = True, verbose_name = 'email')
first_name = models.CharField(max_length = 255, blank = True, null = True, verbose_name = 'name')
last_name = models.CharField(max_length = 255, blank = True, null = True, verbose_name = 'last name')
date_joined = models.DateTimeField(default = timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [ 'first_name' ]
is_active = models.BooleanField(default = True)
is_admin = models.BooleanField(default = False)
is_staff = models.BooleanField(default = False)
objects = AccountManager()
class Meta :
''' '''
verbose_name = 'user'
verbose_name_plural = 'users'
def get_full_name (self) :
''' '''
full_name = '{} {}'.format(self.first_name, self.second_name)
return full_name.strip()
def get_short_name (self) :
''' '''
return self.first_name
def email_user (self, subject, message, from_email = None) :
''' '''
send_mail(subject, message, from_email, [self.email])
def __str__ (self) :
''' '''
return self.email
forms.py
User = get_user_model()
class AccountCreationForm (UserCreationForm) :
''' '''
def __init__ (self, *args, **kargs) :
super(AccountCreationForm, self).__init__(*args, **kargs)
del self.fields[ 'username' ]
class Meta :
''' '''
model = User
fields = ('email',)
class AccountChangeForm (UserChangeForm) :
''' '''
def __init__ (self, *args, **kargs) :
''' '''
super(AccountChangeForm, self).__init__(self, *args, **kargs)
del self.fields[ 'username' ]
class Meta :
''' '''
model = User
fields = ('email',)
admin.py
User = get_user_model()
class AccountAdmin (UserAdmin) :
''' '''
form = AccountChangeForm
add_form = AccountCreationForm
list_display = ('email', 'first_name', 'last_name')
ordering = ('email',)
list_filter = ('is_staff', 'is_active', 'groups')
search_fields = ('email', 'first_name', 'last_name')
filter_horizontal = ('groups', 'user_permissions',)
ordering = ('email',)
fieldsets = (
(None, { 'fields': ('email', 'password') }),
('Personal info', { 'fields': ('first_name', 'last_name') }),
('Permissions', { 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions') }),
('Important dates', { 'fields': ('last_login', 'date_joined') }),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'first_name', 'last_name', 'password1', 'password2') }
),
)
admin.site.register(User, AccountAdmin)
전체 역 추적 :
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/accounts/account/1/
Django Version: 1.7
Python Version: 3.4.0
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar',
'home',
'accounts')
Installed Middleware:
('debug_toolbar.middleware.DebugToolbarMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/contrib/admin/options.py" in wrapper
567. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapped_view
105. response = view_func(request, *args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
52. response = view_func(request, *args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/contrib/admin/sites.py" in inner
204. return view(request, *args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/contrib/admin/options.py" in change_view
1440. return self.changeform_view(request, object_id, form_url, extra_context)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapper
29. return bound_func(*args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapped_view
105. response = view_func(request, *args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/utils/decorators.py" in bound_func
25. return func.__get__(self, type(self))(*args2, **kwargs2)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/db/transaction.py" in inner
394. return func(*args, **kwargs)
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/contrib/admin/options.py" in changeform_view
1428. errors=helpers.AdminErrorList(form, formsets),
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/contrib/admin/helpers.py" in __init__
349. self.extend(list(six.itervalues(form.errors)))
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/forms/forms.py" in errors
154. self.full_clean()
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/forms/forms.py" in full_clean
353. self._clean_fields()
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/forms/forms.py" in _clean_fields
362. value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/home/oleshko/design/.virtualenvs/begemotik/lib/python3.4/site-packages/django/forms/widgets.py" in value_from_datadict
228. return data.get(name, None)
Exception Type: AttributeError at /admin/accounts/account/1/
Exception Value: 'AccountForm' object has no attribute 'get'
실제 추적을 게시하십시오. 게시 한 내용은 유용하지 않습니다. 디버그 페이지가 보이면 "복사하여 붙여 넣기보기로 전환"을 클릭하고 붙여 넣으십시오. –
죄송합니다. –