类型对象'SignupForm'没有'validate'属性
我正在扩展Django认证系统中预定义的用户功能。用的是这个:
#models.py
class Estudiante(models.Model):
user = models.OneToOneField(User)
carrera = models.IntegerField('carrera', choices=CARRERA_CHOICES)
carnet = models.CharField(max_length=8)
horas = models.IntegerField('horas')
class SignupForm(forms.Form):
carrera = models.IntegerField('carrera', choices=CARRERA_CHOICES)
carnet = models.CharField(max_length=8)
class Meta:
model = Estudiante
fields = ('carrera', 'carnet')
def save(self, user):
user.carrera = self.cleaned_data['carrera']
user.carnet = self.cleaned_data['carnet']
user.save()
#admin.py
admin.site.register(Estudiante, SignupForm)
但是当我请求登录页面时,出现了这个错误:
AttributeError at / type object 'SignupForm' has no attribute 'validate' Request Method: GET Request URL: localhost Django Version: 1.6.2 Exception Type: AttributeError Exception Value: type object 'SignupForm' has no attribute 'validate'
我使用的是AllAuth和Django 1.6版本。
1 个回答
1
这里有至少四个明显的错误,还有一些奇怪或不必要的做法。
首先,第二个参数传给 admin.site.register
的应该是一个 admin.ModelAdmin
的子类,而不是一个表单。这是你出错的直接原因。你需要定义一个子类,并把它的 form
参数设置为你的表单。
其次,你的表单是 forms.Form
的子类,而不是 forms.ModelForm
。你需要使用 ModelForm,这样才能让表单和模型之间建立关系。
第三,你有一个缩进错误:Meta 和 save() 方法需要缩进到表单类里面,和字段在同一层级,否则它们根本不会被识别。
第四,save 方法期待一个 user
的值,但这个值不会被传递。而且你想用这个用户做的事情是非常奇怪的:你试图把 carrera 和 carnet 字段设置到那个用户上。但这些字段是 Estudiante 的,而不是 users.User 的:你并没有在任何地方子类化或扩展 User,所以这个模型是完全独立的,只是通过 user
的 OneToOneField 关联。
你可能应该做的是把 Estudiente 设为 AbstractUser 的子类,然后把 AUTH_USER_MODEL
设置为那个模型,具体可以参考 认证文档。