在 Django Admin 中“通过”内联保存 M2M

2024-04-06

显然,如果 ManyToManyField 有中间表,Django 的 ModelAdmin/ModelForm 不允许您使用 save_m2m() 。

模型.py:

from django.db import models


def make_uuid():
    import uuid
    return uuid.uuid4().hex


class MyModel(models.Model):
    id = models.CharField(default=make_uuid, max_length=32, primary_key=True)
    title = models.CharField(max_length=32)
    many = models.ManyToManyField("RelatedModel", through="RelatedToMyModel")

    def save(self, *args, **kwargs):
      if not self.id:
        self.id = make_uuid()
      super(GuidPk, self).save(*args, **kwargs)


class RelatedModel(models.Model):
    field = models.CharField(max_length=32)


class RelatedToMyModel(models.Model):
    my_model = models.ForeignKey(MyModel)
    related_model = models.ForeignKey(RelatedModel)
    additional_field = models.CharField(max_length=32)

管理员.py:

from django import forms
from django.contrib import admin

from .models import MyModel


class RelatedToMyModelInline(admin.TabularInline):
    model = MyModel.many.through


class MyModelAdminForm(forms.ModelForm):
    class Meta:
        model = MyModel


class MyModelAdmin(admin.ModelAdmin):
    form = MyModelAdminForm
    inlines = (RelatedToMyModelInline, )


admin.site.register(MyModel, MyModelAdmin)

如果我先保存 MyModel,然后通过内联添加一个新的相关模型,它工作正常,但如果我尝试设置内联,同时还为新的 MyModel 添加数据,我会收到 Django 管理错误“请更正下面的错误。 ”下面没有突出显示任何内容。

如何让它保存 MyModel,然后保存内联中间模型?显然 Django 可以在保存 MyModel 后保存直通模型 - 所以我只是在寻找一个挂钩。我尝试在调用instance.save()后通过调用save_m2m()来覆盖表单的save()方法,但显然这对于​​带有直通表的M2M不起作用。

我使用的是 Django 1.2,但这在 1.3 中仍然是一个问题。

UPDATE:好吧,我做了一个像上面这样的测试应用程序来隔离问题,看起来它按预期工作,在保存 MyModel 对象后正确保存 M2M 中间对象...只要我让 Django 自动创建 MyModel.id 字段跑步时python manage.py syncdb- 一旦我添加了 GUID id 字段,它就不再起作用了。

这听起来越来越像 Django bug。


在 MyModelAdmin 中,您可以尝试覆盖 save_formset 方法。这样您就可以选择保存的顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django Admin 中“通过”内联保存 M2M 的相关文章

随机推荐

  • SpringBoot Undertow:如何分派到工作线程

    我目前正在查看 springboot undertow 对我来说 不太清楚如何将传入的 http 请求分派到工作线程以阻止操作处理 看着班级Undertow 嵌入式 Servlet Container class 看起来没有办法实现这种行为
  • 如何从PDO PHP 中的prepare() 获取查询错误?

    st db gt prepare SELECT FROM c6ode 在上述情况下 如何检查查询的故意 mysql 错误 需要设置错误模式属性PDO ATTR ERRMODE to PDO ERRMODE EXCEPTION 因为您期望异常
  • C 中 scanf 函数的格式说明符中 %c 规范之前的空格

    当我之间不包含空格时 d and c格式字符串中的规范scanf 在以下程序中运行函数 并在运行时输入 4 h 则输出为 Integer 4 and Character 究竟如何可变 c 在这种情况下接受输入 如果我在之间包含空格 会有什么
  • 在Google搜索时如何从第一页获取图像?

    通常使用Google搜索城市后 右侧会出现维基百科页面的一部分 其中包含图像和地图 谁能告诉我如何访问该图像 我应该知道怎么下载 实际上 主图像 与右侧地图图像一起 很少来自维基百科 因此您无法使用维基百科 API 来获取它 如果您想访问实
  • 在 GridView 或 ListView 底部添加额外空间

    是否可以在 GridView 底部添加额外的空间 有点像空行 我希望当你向下滚动到 GridView 底部时 会有额外的 50dp 的空白空间 我尝试设置paddingBottom到50dp 但似乎没有改变任何东西 如果我理解正确的话 它应
  • Grails - SpringSecurityPlugin 不生成控制器

    我是 Grails 新手 我按照说明安装 SpringSecurityPlugin 版本 2 0 RC2 并执行命令 grails s2 quickstart 用户角色 应该在其他文件中生成 登录控制器 and 注销控制器 但这些控制器不会
  • Kafka - 如何捕获kafka客户端后台线程生成的消息

    使用以下配置来模拟消费者关闭 会话超时 我们如何捕获客户端记录到控制台的消息 SESSTMOUT rdkafka consumer 1 第三 主要 consumed message None msg1 0 first topic 0 Non
  • 如何让编译日志在Emacs中创建一个新窗口?

    如果我在 emacs 中只显示一个窗口并使用 M x 编译 则该窗口会一分为二 我可以轻松查看编译缓冲区 但是 如果我显示更多窗口 编译日志就会接管其他窗口之一 这让我感到恼火 如何让emacs始终分割一个新窗口来显示编译日志 编辑 从我一
  • 主要和次要刻度线风格不同,整个页面覆盖D3?

    我想绘制一个带有主要和次要刻度的轴 以不同的方式覆盖我的整个页面 我遵循的结构this https stackoverflow com questions 19242674 major and minor ticks with v3 of
  • 访问数据转换问题

    我正在使用 Access 2003 有一个表 其中文本数据列中包含一些日期值 如下所示 May 97 Jun 99 Jun 00 Sep 02 Jan 04 我需要将它们转换为正确的日期格式并转换为另一个日期 时间列 因此创建一个新的日期
  • 使用 WiX 进行重大升级后无法启动 Windows 服务

    我有一个非常简单的 WiX 项目 没有什么花哨 当尝试对现有安装执行 MajorUpgrade 时 无法启动服务 并且不可避免地会回滚到以前的版本并正常启动服务 我已经删除了Start install 并成功手动启动应用程序 所以我知道这不
  • [__NSCFDictionary setObject:forKey:]:发送到不可变对象的变异方法

    id init if self super init NSMutableArray listname NSMutableArray alloc initWithObjects cu al zn au ru fu rb pb wr nil N
  • 动画后接收指针事件的链接在 Safari 中不可点击

    我正在使用 CSS 为文本添加动画 其中元素一个接一个地出现 首先尝试一下看看我的意思 wrapper pointer events none remove pointer events from elements before they
  • 加载文件量角器失败 - 失败:脚本超时:11 秒内未收到结果

    我尝试执行使用量角器上传文件的测试时出错 我的代码是这个 it it should be possible to upload a file function browser get buildUrl popupEnvironment el
  • 设置Flex Slider轮播图片的显示量

    我在我的网站上嵌入了带有轮播的柔性滑块 但是 我没有很好地设置滑块的属性 或者可能是CSS 它是这样的 http www screencast com t xlRssnj43 http www screencast com t xlRssn
  • tcplistener绑定所有本地地址?

    我正在使用一个服务器应用程序 我将地址绑定到 127 0 0 1 直到我想从虚拟机内的客户端进行连接时 一切都很好 所以我将它绑定到 192 现在我的测试全部连接到 127 无法连接 我知道我可以使用 Any 但我不想连接外部互联网 我知道
  • Windows Phone 8 绑定到具有格式的字符串资源

    我的本地化资源字符串 名为TextResource具有以下值 Text 0 Where 0 是 String Format 的占位符 我的用户控件有一个名为 DependecyPropertyCount 我想绑定Count到文本框的文本 还
  • 发送包含数据框作为弹性表的电子邮件

    我有一个每天用来发送邮件的代码 我使用 xtable 包来完成它 但最近 我已经习惯使用弹性表 因为它更符合我的要求 但是当我更改代码以使用 flextable 函数时 我发送的只是一封没有正文的空白邮件 这是示例数据集 samplemon
  • 让我的用户脚本等待其他脚本加载

    Edit 我将用一个演示问题的简化示例来替换原来的 令人困惑的问题 背景 我正在尝试编写一个将在 Chrome 中运行的用户脚本 该脚本需要调用 JavaScript 函数AlertMe 它位于用户脚本之外 此函数是页面的一部分 包含在服务
  • 在 Django Admin 中“通过”内联保存 M2M

    显然 如果 ManyToManyField 有中间表 Django 的 ModelAdmin ModelForm 不允许您使用 save m2m 模型 py from django db import models def make uui