类型对象'SignupForm'没有'validate'属性

1 投票
1 回答
1312 浏览
提问于 2025-04-18 08:14

我正在扩展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 设置为那个模型,具体可以参考 认证文档

撰写回答