[英]Python/Django: __dict__ attribute error message when adding custom fields to UserCreationForm
發生此錯誤是因為我嘗試將自定義字段添加到UserCreationForm。 我現在已經制作了兩個自定義字段 - cristin和rolle -but但是當我按下注冊按鈕時,我收到以下錯誤消息: / accounts / signup /上的AttributeError - 'tuple'對象沒有屬性'__dict__'。
(但是,新用戶實際上已注冊,並且在管理面板中可見)。
在我的models.py文件中,我有:
...
class User(auth.models.User,auth.models.PermissionsMixin):
def __str__(self):
return "@{}".format(self.username)
class Userextended(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
cristin = models.IntegerField()
rolle = models.CharField(max_length=100)
...
在我的forms.py文件中,我有:
...
class UserCreateForm(UserCreationForm):
cristin = forms.IntegerField(required=False)
rolle = forms.CharField(max_length=100,required=True)
class Meta():
fields = ('username','first_name','last_name','email','password1','password2')
model = User
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields['username'].label = 'Username'
self.fields['email'].label = 'Email Adress'
self.fields['first_name'].label = 'First name'
self.fields['last_name'].label = 'Last name'
self.fields['cristin'].label = 'Cristin ID'
self.fields['rolle'].label = 'Role'
def save(self, commit=True):
if not commit:
raise NotImplementedError("Can't create User and Userextended without database save")
user = super(UserCreateForm, self).save(commit=True)
user_profile = Userextended(user=user,cristin=self.cleaned_data['cristin'],rolle=self.cleaned_data['rolle'])
user_profile.save()
return user, user_profile
...
RankJameous在評論中提出的完整追溯如下:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/accounts/signup/
Django Version: 1.11.2
Python Version: 3.6.1
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar',
'bootstrap3',
'accounts']
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',
'debug_toolbar.middleware.DebugToolbarMiddleware']
Traceback:
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/base.py" in dispatch
88. return handler(request, *args, **kwargs)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in post
217. return super(BaseCreateView, self).post(request, *args, **kwargs)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in post
183. return self.form_valid(form)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in form_valid
163. return super(ModelFormMixin, self).form_valid(form)
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in form_valid
79. return HttpResponseRedirect(self.get_success_url())
File ".../anaconda/envs/fairAppEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in get_success_url
148. url = self.success_url.format(**self.object.__dict__)
Exception Type: AttributeError at /accounts/signup/
Exception Value: 'tuple' object has no attribute '__dict__'
我做錯了什么,我應該在哪里放置錯誤消息所要求的__dict__ ?
你試圖在__init__
設置字段標簽,但是, fields
是一個元組而不是字典,即使它是一個字典,這也不是正確的方法。
您應該在Form的Meta
中將labels
設置為dict:
class UserCreateForm(UserCreationForm):
cristin = forms.IntegerField(required=False)
rolle = forms.CharField(max_length=100,required=True)
class Meta():
fields = ('username','first_name','last_name','email','password1','password2')
model = User
labels = {'username': 'Username',
'first_name': 'First name',
...
'role': 'Role'}
無需覆蓋__init__
。
最后,您的save
方法應該只返回用戶對象:
def save(self, commit=True):
...
return user
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.