type object' SignupForm'没有属性'验证'

时间:2014-06-01 23:14:10

标签: python django django-models django-forms django-allauth

我正在扩展de用户预定义的Django Auth。有了这个:

#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 个答案:

答案 0 :(得分:0)

这里至少有四个彻头彻尾的错误,另外你还做了一些奇怪或不必要的事情。

所以,错误:首先,admin.site.register的第二个参数是admin.ModelAdmin子类,而不是Form。这是你错误的直接原因。您需要定义一个子类并将其form参数设置为表单。

其次,您的表单是forms.Form的子类,而不是forms.ModelForm。您需要使用ModelForm来获取表单和模型之间的关系。

第三,你有一个缩进错误:Meta和save()方法需要在表单类中缩进,与字段处于同一级别 - 否则它们将无法被识别。

第四,save方法期望user值,不会传递。你试图用这个用户做的事情非常奇怪:你正试图将carrera和carnet字段设置到该用户身上。但那些是Estudiante的字段,而不是users.User:你实际上没有在任何地方进行子类化或扩展用户,因此该模型是完全独立的,只能通过user OneToOneField链接。

你应该做的是让Estudiente成为AbstractUser的子类,然后将AUTH_USER_MODEL设置为该模型,如the authentication docs中所述。