Django InlineModelAdmin - набор встраивает поле от запроса на сохранении (поле пользователя аппарата автоматически) (save_formset по сравнению с save_model)

У меня есть две модели, MainModel и связанный InlineModel, который я хотел бы показать как встроенное в администраторе. Этот InlineModel может использоваться для того, чтобы, скажем, сделать примечания о модели и должен отследить зарегистрированного администраторского пользователя, вносящего изменения. В то время как это кажется простым (и действительно, документы показывают пример для этого, когда пользовательское поле является частью MainModel), я, может казаться, не схватываю его, когда поле идет Встроенное.

Чтобы быть конкретной, моя цель:

  1. Пользователь редактирует MainModel
  2. Пользователь добавляет InlineModel, не заполняя пользовательское поле
  3. Пользовательские нажатия сохраняют
  4. Код заполняет пользовательское поле для недавно созданных экземпляров InlineModel
  5. (Премия! пользовательское поле только для чтения для существующих экземпляров, и скрытый для нового встраивает),

И мои вопросы:

  1. Это корректно? Также bas save_model не требуется экземпляры InlineModelAdmin
  2. Выполнение его этот путь позволяют мне сохранять, не вызывая ошибку? (пользователь требуется, проверка отмечает его),
  3. То, как я могу скрыться, поле ввода данных пользователем для нового встраивает, и имейте его только для чтения для существующего, встраивает?

Вот мои текущие идеи:


#models.py
class MainModel(models.Model):
    some_info = models.IntegerField()

class InlineModel(models.Model):
    main = models.ForeignKey(MainModel)
    data = models.CharField(max_length=255)
    user = models.ForeignKey('auth.User')

#admin.py
class InlineModelInline(admin.TabularInline):
    model = InlineModel
    fields = ('data', 'user')
    #readonly_fields = ('data', 'user') #Bonus question later

class MainModelAdmin(admin.ModelAdmin):
    list_display = ('id', 'some_info')
    inlines = [InlineModelInline]

    #def save_model(self, request, obj, form, change):
        #http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
        #Only called for MainModel, not for any of the inlines
        #Otherwise, would be ideal

    def save_formset(self, request, form, formset, change):
        #http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset
        #Experimenting showd this is called once per formset (where the formset is a group of inlines)
        #See code block at http://code.djangoproject.com/browser/django/tags/releases/1.2.1/django/contrib/admin/options.py#L894
        if not isinstance(formset.model, InlineModel):
            return super(MainModelAdmin, self).save_formset(request, form, formset, change)
        instances = formset.save(commit=False)
        for instance in instances:
            if not instance.pk:
                instance.user = request.user
        instance.save()
        formset.save_m2m()
14
задан EB. 10 June 2010 в 16:04
поделиться

1 ответ

Я решил первую половину своего вопроса:

def save_formset(self, request, form, formset, change):
    if formset.model != InlineModel:
        return super(MainModelAdmin, self).save_formset(request, form, formset, change)
    instances = formset.save(commit=False)
    for instance in instances:
        if not instance.pk:
            instance.user = request.user
        instance.save()
    formset.save_m2m()

Теперь меня интересует бонусное поведение:

  1. Мне нужно выбрать пользователя при добавлении нового встроенного к правилам проверки. Мое лучшее предположение - не включать поле «пользователь» в мой кортеж InlineModelInline.fields, но тогда это не покажет автора для существующих экземпляров InlineModel. (Правка: здесь работает добавление "пользователя" в readonly_fields)

  2. (Правка) Как я могу сделать существующие встроенные строки отображать "данные" только для чтения, но при этом иметь возможность редактировать их при добавлении новой встроенной строки?

9
ответ дан 1 December 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: