django-admin - как изменить ModelAdmin для создания нескольких объектов одновременно? - PullRequest
8 голосов
/ 08 июня 2010

давайте предположим, что у меня очень базовая модель

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

эта модель зарегистрирована в модуле администратора:

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

В настоящее время, когда я захожу в интерфейс администратора, после нажатия "Добавить"сообщение "У меня есть только одна форма, в которую я могу ввести msg.

. Я хотел бы иметь несколько форм (возможно, набор форм) на" Добавить страницу ", чтобы я мог создавать несколько сообщений одновременно.Это действительно раздражает необходимость каждый раз нажимать кнопку «Сохранить и добавить еще».

В идеале я хотел бы добиться чего-то вроде InlineModelAdmin, но оказалось, что вы можете использовать его только для моделей, связанных с редактируемым объектом.

Что бы вы порекомендовалииспользовать для решения этой проблемы?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Это может быть не совсем то, что вы ищете, но если вы хотите создать несколько объектов одновременно, вы можете примерно так:

#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 голос
/ 08 июня 2010

В качестве обходного пути, поскольку, вполне вероятно, что у вас есть FK до User, поэтому вы можете определить InlineModel для User модели.

В противном случае простейшим подходом может быть создание настраиваемого представления администратора, поскольку нет общего представления администратора, которое отображает и сохраняет наборы форм.

0 голосов
/ 21 февраля 2014

Это легко, если вы используете Inline. Тогда вы можете использовать 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 может быть сгенерировано динамически для произвольного значения.

Надеюсь, это поможет!

...