Python Django子类(模型)未实现超类的属性
我为我的网站用户创建了一个模型:Python Django子类(模型)未实现超类的属性,python,django,Python,Django,我为我的网站用户创建了一个模型: class ImrayWebsiteUser(models.Model): user = models.OneToOneField(User) score = models.IntegerField(default=0) birthDate = models.DateField(null=True,blank=True) clubs = models.ManyToManyField(Club) 在视图中,我创建了一个供新
class ImrayWebsiteUser(models.Model):
user = models.OneToOneField(User)
score = models.IntegerField(default=0)
birthDate = models.DateField(null=True,blank=True)
clubs = models.ManyToManyField(Club)
在视图中,我创建了一个供新用户注册的页面。当他们单击register(填写表单后)时,我创建了另一个视图来检查表单并保存用户数据(如果它有效)
以下是观点:
def register_user(request):
if request.method == 'POST':
form = MyRegistrationForm(request.POST)
if form.is_valid():
form.save() #save user registeration data
return HttpResponseRedirect('/accounts/register_success')
# in the first time it generate empty form:
args = {}
args.update(csrf(request))
args['form'] = MyRegistrationForm()
return render_to_response('accounts/register.html', args)
及表格:
class MyRegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
first_name = forms.CharField(required=False,max_length=30)
last_name = forms.CharField(required=False,max_length=30)
class Meta:
model = ImrayWebsiteUser
fields = ('username', 'email', 'password1', 'password2',
'first_name', 'last_name')
def save(self, commit=True):
user = super(MyRegistrationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
user.firstname = self.cleaned_data['first_name']
user.lastname = self.cleaned_data['last_name']
# user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
问题是,当我填写表单信息并单击register(从而执行视图并将数据发送到表单)时,我会得到一个属性错误
,表示ImrayWebsiteUser
没有名为set\u password
的属性。但这不应该发生,因为我的用户ImrayWebsiteUser
显然实现了内置的用户类型
这是错误代码:
AttributeError at /accounts/register/
'ImrayWebsiteUser' object has no attribute 'set_password'
Request Method: POST
Request URL: http://127.0.0.1:8000/accounts/register/
Django Version: 1.5
Exception Type: AttributeError
Exception Value:
'ImrayWebsiteUser' object has no attribute 'set_password'
Exception Location: C:\Python27\lib\site-packages\django\contrib\auth\forms.py in save, line 107
Python Executable: C:\Python27\python.exe
Python Version: 2.7.6
Python Path:
['C:\\Users\\Imray\\ImraySite\\bitbucket',
'C:\\Python27\\lib\\site-packages\\setuptools-2.1-py2.7.egg',
'C:\\Windows\\SYSTEM32\\python27.zip',
'C:\\Python27\\DLLs',
'C:\\Python27\\lib',
'C:\\Python27\\lib\\plat-win',
'C:\\Python27\\lib\\lib-tk',
'C:\\Python27',
'C:\\Python27\\lib\\site-packages']
Server time: Thu, 13 Mar 2014 11:56:27 +0200
您的
OnetoOneField
不是用户模型的实现
在您的案例中,您可以访问OneToOneField
作为object.user
属性
由于您正在使用内置的UserCreationForm
实现set\u password
,因此您可以在模型中创建一个名为set\u password
的方法,并调用self.user.set\u password
但我建议您研究自定义用户实现:
编辑:
这只是我从你的问题中得到的一个概念:
class UserProfile(models.Model):
user = models.OneToOneField(User)
.....your other attributes
对于注册表单,您还可以执行以下操作:
class MyRegistrationForm(UserCreationForm):
....your registration form attributes from UserProfile Model
class Meta:
fields = ('username', 'email', 'firstname', 'lastname') # fields of User Model not your UserProfile Model
def save(self, commit=True):
user = super(MyRegistrationForm, self).save(commit=commit)
userprofile = UserProfile(user=user)
userprofile.attribute = form.cleaned_data[attribute_name]...
return user|userprofile #as required
另外,
csrf
已在模板中作为{%csrf_token%}提供。实际上,我的用户和内置用户类型之间的唯一区别是,我的用户与我项目中的其他模型有一些关系。我应该用另一种方式实现我自己的用户吗?你能告诉我,或者告诉我在哪里可以找到self
实际上是什么吗?(不是柏拉图意义上的,而是从它是什么对象的意义上来说——它是会话吗?它是用户吗?我通常可以用它做什么?self
是初始化/调用类的对象参数。它类似于C++或java中的<>代码> <代码>。在python世界中,显式优于隐式。
。基本上,您可以做的是为内置的用户模型创建foreignkey,只需添加额外的字段[不是由用户模型本身提供的]。我尝试了您的说明,但没有成功。我仍然会出错(DoesNotExist)