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

时间:2010-06-07 22:09:21

标签: python django django-models django-admin django-forms

让我们假设我有非常基本的模型

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

此模型已在管理模块中注册:

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

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

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

理想情况下,我希望实现InlineModelAdmin之类的功能,但事实证明,您只能将其用于与编辑对象相关的模型。

您建议使用什么来解决此问题?

3 个答案:

答案 0 :(得分:3)

这可能不是您正在寻找的,但如果您想同时创建多个对象,您可以这样做:

#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()

基本上你正在做的是为你的管理模板创建一个自定义表单,它要求用户创建对象的次数。逻辑不是在save_model方法中解释的。

答案 1 :(得分:1)

作为一种解决方法,因为,您可能有User的FK,因此您可以在InlineModel模型上定义User

否则,最简单的方法可能是创建自定义管理视图,因为没有显示和保存模板集的通用管理视图。

答案 2 :(得分: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)

这将在Admin视图中为您提供所需的内容并创建分组(即使您只允许一个组),并且唯一的额外字段将是组模型中的name。我甚至不确定你是否需要那个。此外,我确信可以为任意值动态生成extra的值。

我希望这有帮助!