首页 > 解决方案 > 如何在Django Ajax表单提交中避免“AttributeError:'ModelFormOptions'对象没有属性'concrete_model'”

问题描述

我一直在尝试使用 Ajax 在我的 Django 应用程序中发布相关模型中的记录。为了更新一对父/子模型,我正在使用以下视图,并且记录保存在相应的模型中。但是,我不断收到以下错误:

AttributeError: 'ModelFormOptions' 对象没有属性 'concrete_model'"

以下是设置:

视图.py

class MatListCreateView(LoginRequiredMixin, CreateView):
    template_name = "..."
    model = MatHdrList
    form_class = CreateMatHdrListForm
    
    def get(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        mat_bom_list = CreateBomMatListFormset

        return self.render_to_response(
            self.get_context_data(form=form, mat_bom_list=mat_bom_list)
        )

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        mat_bom_list = CreateBomMatListFormset(self.request.POST)

        if self.request.is_ajax and self.request.method == "POST":
            if form.is_valid() and mat_bom_list.is_valid():
                form.instance.created_by = self.request.user
                self.object = form.save()
                mat_bom_list.instance = self.object
                mat_bom_list.save()

                ser_instance = serializers.serialize('json', [ form, mat_bom_list, ])
                return JsonResponse({"instance": ser_instance}, status=200)
            else:
                return JsonResponse({"error": form.errors}, status=400)
        return JsonResponse({"error": "Whoops"}, status=400)

模板(jQuery ajax 部分)

$('#materialListForm').submit(function(e) {
    e.preventDefault();
    var serializedData = $(this).serialize();
    console.log(serializedData);
    // var url1 = "{% url 'matl_list' %}";

    $.ajax({
        url: "{% url 'material_list_create' %}",
        type: 'POST',
        data: serializedData,
        success: function() {
            console.log('Data Saved');
            // window.location = url1;
        },
        error: function (response, status, error) {
            console.log('Problem encountered');
            alert(response.responseText);
        }
    });
});

发布(表单提交)时AttributeError: 'ModelFormOptions' object has no attribute 'concrete_model'显示效果警报。关闭警报不会退出页面(即使window.location在 ajax 调用中)。回到调用页面(即对象listview)显示记录已添加到父模型和子模型中。

有人可以建议一种摆脱上述错误的方法吗?

标签: jquerydjangoajaxattributeerror

解决方案


如果您的 Class 中没有属性,则会发生属性错误。

考虑到我有这样的课,

Class SuperHero(Models.Model):
    real_name = models.CharField(max_length=50)
    character_name = models.CharField(max_length=50)

另外,我创建了一个实例,

batman = SuperHero(real_name='BruceWayne'. character_name='BatMan')

现在,real_name 和 character_name 是该SuperHero对象的属性。

如果您正在访问一些类似batman.real_name的内容,它将为您提供值 as BruceWayne。但是如果你想要一些其他的东西batman.super_powers,它会通过 `AttributeError: 'SuperHero' object has no attribute 'super_power'。

检查你的ModelFormOptions模型,我希望concrete_model不应该在那里。


推荐阅读