我正在扩展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
答案 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中所述。