您的位置:

ImproperlyConfigured("Using ModelFormMixin (base class of %s) without ""the 'fields' attribute is prohibited." % self.__class__.__name__)的处理方案

  发布时间:2023-04-04 10:46:48
报错的原因这个错误是因为在使用Django的FormView类或者ModelFormMixin类时,没有指定表单中包含哪些字段,而是让Django自动推断。解决方法就是在使用FormView类或者ModelFormMixin类创建表单视图时,明确指定表单中包含哪些字段, 可以在forms.py里面定义一个form类, 也可以在视图里面指定或者这样就能避免的错误了。使用例子当然可以,下面是一个示例或者这样在访问此视图的时候就能显示包含'name'和'age'的表单,并且表单的提交能正常的保存数据了。

报错的原因

这个错误是因为在使用Django的FormView类或者ModelFormMixin类时,没有指定表单中包含哪些字段,而是让Django自动推断。

Django中的FormView类和ModelFormMixin类都是用来简化创建表单视图的基类,当我们使用这些类来创建表单视图时,通常需要指定表单中包含哪些字段。如果没有指定字段,Django会给出这样的错误提示。

解决方法就是在使用FormView类或者ModelFormMixin类创建表单视图时,明确指定表单中包含哪些字段, 可以在forms.py里面定义一个form类, 也可以在视图里面指定。


from django import forms
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1','field2','field3']

class MyView(FormView):
    form_class = MyForm
    template_name = 'my_template.html'

或者


class MyView(FormView):
    fields = ['field1','field2','field3']
    template_name = 'my_template.html'

这样就能避免 ImproperlyConfigured 的错误了。

如何解决

解决这个错误的方法是在使用FormView类或者ModelFormMixin类创建表单视图时,明确指定表单中包含哪些字段。可以通过以下方式实现:

1. 定义一个form类, 并在其中指定model和fields.


from django import forms
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1','field2','field3']

2. 在视图中使用form_class属性来指定使用哪个form类


class MyView(FormView):
    form_class = MyForm
    template_name = 'my_template.html'

3. 或者直接在视图类中指定fields属性


class MyView(FormView):
    fields = ['field1','field2','field3']
    template_name = 'my_template.html'

这样就能解决 ImproperlyConfigured 的错误了。

使用例子

当然可以,下面是一个示例:


from django import forms
from django.views.generic import FormView
from django.urls import reverse_lazy

# define your model and form
class MyModel(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['name','age']

class MyView(FormView):
    form_class = MyForm
    template_name = 'my_form.html'
    success_url = reverse_lazy('success')
    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

或者


class MyView(FormView):
    fields = ['name','age']
    template_name = 'my_form.html'
    success_url = reverse_lazy('success')
    def form_valid(self, form):
        model_obj = MyModel(**form.cleaned_data)
        model_obj.save()
        return super().form_valid(form)

这样在访问此视图的时候就能显示包含'name'和'age'的表单,并且表单的提交能正常的保存数据了。

这只是一个简单的例子,对于更复杂的应用场景也可以采用类似的方法来解决这个问题。