如何在包含M2M字段的AdminForm中使用save_model?

时间:2011-11-29 17:18:23

标签: django django-admin manytomanyfield

我对django模型系统及其默认管理员有一个恼人的问题。

我们假设我有一个非常简单的模型,如:

class Note(models.Model):
    text = models.CharField(max_length=200)

def __unicode__(self):
    return self.text

和一个容器如:

class NoteCollection(models.Model):
    notelist = models.ManyToManyField(Note)
    title = models.CharField(max_length=20)

def __unicode__(self):
    return self.title

我想要做的是在添加NoteCollection时更新所有“Note”元素。 我读到m2m模型有复杂的保存机制,所以我想的是,让我们读取表单对象,然后自己保存Note元素!!

但是当我在APPNAME / admin.py中创建这样的东西时:

from models import Note,NoteCollection
from django.contrib import admin

class NoteCollectionAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # Something USEFUL HERE
        pass

admin.site.register(Note)
admin.site.register(NoteCollection, NoteCollectionAdmin)

Django弹出一个错误:('NoteCollection'实例需要有一个主键值才能使用多对多关系。)

我甚至不想使用NoteCollection对象,我对表单对象很感兴趣,实际上......

我还在互联网上找到了一些使用带有M2M字段的save_model的例子,所以我无法理解为什么我一直收到这个错误;作为参考,我刚刚制作了一个新的废料项目,我正在使用sqlite db进行测试

1 个答案:

答案 0 :(得分:1)

通过覆盖NoteCollectionAdmin中的save_model(),您将阻止Django保存您的notecollection。在处理完所有内容之后,Django会保存m2m表,但是因为notecollection没有自动ID而失败,因为你没有将它保存在数据库中。

主要问题是Django在保存对象后保存了m2m文件。几天前我纠结于此,请参阅http://reinout.vanrees.org/weblog/2011/11/29/many-to-many-field-save-method.html

有些相关问题:Issue with ManyToMany Relationships not updating inmediatly after save