【问题标题】:type object 'SignupForm' has no attribute 'validate'类型对象“SignupForm”没有属性“验证”
【发布时间】:2014-07-22 00:50:03
【问题描述】:

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

#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)

当我请求登录页面时收到此错误:

属性错误在 / 类型对象“SignupForm”没有属性“验证” 请求方法:GET 请求地址:本地主机 Django 版本:1.6.2 异常类型:属性错误 异常值: 类型对象“SignupForm”没有属性“验证”

我正在使用 AllAuth,Django 1.6

【问题讨论】:

  • 不确定django框架是否默认添加了构造函数。如果没有,添加初始化成员数据和基类的构造函数应该会有所帮助。

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


【解决方案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 设置为该模型,如 the authentication docs 中所述。

【讨论】:

  • 谢谢!!大部分工作,现在我需要做一些调整,因为我使用 Allauth,但错误消失了。缩进错误是我将代码复制到页面时出错。菜鸟。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多