django-admin - 如何修改ModelAdmin以一次创建多个对象?
假设我有一个非常基础的模型
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()
基本上,你是在为你的管理模板创建一个自定义表单,这个表单会询问用户想要创建多少个对象。然后,这个逻辑会在保存模型的方法中被处理。