Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django子类(模型)未实现超类的属性_Python_Django - Fatal编程技术网

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)