jquery - 如何在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)显示记录已添加到父模型和子模型中。
有人可以建议一种摆脱上述错误的方法吗?
解决方案
如果您的 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
不应该在那里。
推荐阅读
- python - python - 从原始 ext4 图像读取文件信息和权限
- reactjs - 如何使用 Azure AD 获取用户配置文件详细信息
- webpack - 网页包。构建组件库
- node.js - node.js node-red - 将 Base64 字符串转换为 uint8array
- java - 在两个元素之间替换数字 Java 中的 .(dot)
- charts - 如何为响应式站点动态调整 chart.js 图形的大小?
- python - 在没有 Celery 和 Ajax 的情况下使用来自 python 文件的值更新 Django 中的进度条
- python - Python:绘制不连续的数据-breakaxis 包是否也适用于 pandas 日期时间?
- python - Mongodb在现有文档中添加一个新字段,具有特定位置
- javascript - 事件发射器 - UnhandledPromiseRejectionWarning:未处理的承诺拒绝