【问题标题】:How to avoid "AttributeError: 'ModelFormOptions' object has no attribute 'concrete_model'" in Django Ajax form submit如何在Django Ajax表单提交中避免“AttributeError:'ModelFormOptions'对象没有属性'concrete_model'”
【发布时间】:2020-11-05 11:28:47
【问题描述】:

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

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

以下是设置:

views.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'。关闭 alert 不会退出页面(即使在 ajax 调用中使用 window.location)。回到调用页面(即对象 listview)显示记录已添加到父模型和子模型中。

有人可以提出一种消除上述错误的方法吗?

【问题讨论】:

    标签: jquery django ajax attributeerror


    【解决方案1】:

    如果您的 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 的内容,它将为您提供BruceWayne 的值。 但是如果你想要一些其他的东西,比如batman.super_powers,它会通过 `AttributeError: 'SuperHero' object has no attribute 'super_power'。

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

    【讨论】:

    • 你确定你在说什么吗?没有 ModelFormOptions 模型(??!) - 至少不是我创建的。这是 Django 固有的消息,由于手头的代码错误(我得到了类似的查询,例如here,尽管在不同的上下文中)。当然,我无法解决它,因此我的问题在这里。
    • 您有单独的序列化程序文件吗?对于 Rest Framework 还是什么?
    • 不,不用休息(或某事)。如果您真的想对此进行测试,请创建一个场景,让您了解清楚。
    • 你是说我的代码?对不起。已经提供的信息就是解决问题所需要的全部信息。寻找其他选择。谢谢。
    • 不是完整的代码。导致此错误的代码。
    猜你喜欢
    • 2019-07-05
    • 2020-07-08
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多