TypeError: super(type, obj): obj 必须是 type 的实例或子类型?

ims*_*ful 1 django django-models django-forms django-views python-3.x

为什么我会收到此错误?

TypeError: super(type, obj): obj must be an instance or subtype of type
Run Code Online (Sandbox Code Playgroud)

这是我的 models.py 文件

class UserNotification(models.Model):
Name = models.CharField(max_length=250)
Mobile_No = models.CharField(max_length=10, validators=[RegexValidator(r'^\d{1,10}$')])
Proof = models.TextField()
viewed = models.BooleanField(default=False)
user = models.ForeignKey(User)
date = models.DateTimeField(default=timezone.now)

def __str__(self):
    return self.Name

class Meta:
    ordering = ["-date"]
Run Code Online (Sandbox Code Playgroud)

这是我的views.py 文件

class RequestItem(generic.CreateView):
    model = UserNotification
    fields = ['Name', 'Mobile_No', 'Proof']

    def get_form(self, form_class=None):
        if form_class is None:
            form_class = self.get_form_class()
        form = super(UserNotification, self).get_form(form_class)
        form.fields['Name'].widget = TextInput(attrs={'placeholder': '*Enter your name'})
        form.fields['Mobile_No'].widget = TextInput(
            attrs={'placeholder': "*Enter your's mobile number to get a call back from angel"})
        form.fields['Proof'].widget = TextInput(attrs={'placeholder': '*enter proof you have for your lost item'})
        return form

    def form_valid(self, form):
        print(self.kwargs)

        self.object = form.save(commit=False)
        qs = Report_item.objects.filter(id=self.kwargs.get("pk"))
        self.object.user = qs[0].owner
        self.object.save()
        return HttpResponse("<h1>Your request has been processed</h1>")
Run Code Online (Sandbox Code Playgroud)

我正在使用 django 1.11。在我添加占位符函数之前,没有错误并且代码正常工作。添加占位符后,我收到此错误。请帮我解决它。

Dan*_*man 5

问题是你在哪里调用super()inside get_form。您需要使用当前的类;由于某种原因,您已将模型类放在那里。它需要是:

form = super(RequestItem, self).get_form(form_class)
Run Code Online (Sandbox Code Playgroud)

或者更好,因为您使用的是 Python 3,所以使用简短版本:

form = super().get_form(form_class)
Run Code Online (Sandbox Code Playgroud)

但请注意,这并不是完成您在此处尝试执行的操作的好方法。相反,声明一个实际的表单类,它为要更改的字段设置小部件属性,并通过在form_class类级别设置属性来在视图类中引用它。