django-admin - 如何修改ModelAdmin以一次创建多个对象?

8 投票
3 回答
5212 浏览
提问于 2025-04-15 23:40

假设我有一个非常基础的模型

class Message(models.Model):
      msg = models.CharField(max_length=30)

这个模型已经在管理模块中注册了:

class MessageAdmin(admin.ModelAdmin):
    pass
admin.site.register(Message, MessageAdmin)

现在,当我进入管理界面后,点击“添加消息”,我只有一个表单可以输入msg

我希望在“添加页面”上能有多个表单(也许是表单集),这样我就可以一次性创建多个消息。每次都要点击“保存并添加另一个”真的很烦。

理想情况下,我想实现类似InlineModelAdmin的功能,但结果发现这个功能只能用于与正在编辑的对象相关的模型。

你有什么建议可以解决这个问题吗?

3 个回答

0

如果你使用的是内联表单,这个事情就简单多了。你可以用 extra = 10 或者你想要的任意数量的额外表单组。不过在 ModelAdmin 中似乎没有类似的功能。

当然,在你的消息模型中,你需要创建一个 ForeignKey,也就是外键,指向某种消息分组模型,这样才能实现你想要的多表单布局。

举个例子:

models.py:
    class Group(models.Model):
        name = models.CharField(max_length=30)
    class Message(models.Model):
        msg = models.CharField(max_length=30)
        grp = models.ForeignKey(Group)

admin.py:
    class MessageInline(admin.TabularInline):
        model = Message
        extra = 10
    class GroupAdmin(admin.ModelAdmin):
        inlines = [MessageInline]
    admin.site.register(Group, GroupAdmin)

这样在管理界面中就能实现你想要的效果,还能创建分组(即使你只允许一个分组),唯一额外的字段就是分组模型中的 name。我甚至不确定你是否真的需要这个字段。此外,我相信 extra 的值可以动态生成,适应不同的需求。

希望这些对你有帮助!

1

作为一种解决方法,可能你在User模型中有一个外键(FK),所以你可以在User模型上定义一个InlineModel

另外,最简单的方法可能是创建一个自定义的管理界面,因为没有一个通用的管理界面可以显示和保存表单集合。

4

这可能不是你想要的完全答案,但如果你想同时创建多个对象,可以试试这样做:

#In /forms.py
MessageAdminForm(forms.ModelForm):
    msg = CharField(max_length=30)
    count = IntegerField()

#In /admin.py
from app.admin import MessageAdminForm
MessageAdmin(admin.ModelAdmin):
    form = MessageAdminForm
    fieldsets = (
        (None, {
            'fields' : ('msg','count')    
         }),)
    def save_model(self, request, obj, form, change):
        obj.msg = form.cleaned_data['msg']
        obj.save()
        for messages in range(form.cleaned_data['count']):
            message = Message(msg=form.cleaned_data['msg'])
            message.save()

基本上,你是在为你的管理模板创建一个自定义表单,这个表单会询问用户想要创建多少个对象。然后,这个逻辑会在保存模型的方法中被处理。

撰写回答