У меня есть две модели, MainModel и связанная InlineModel, которые я хотел бы показать в качестве встроенного в админке.Эта InlineModel может использоваться, например, для создания заметок о модели и должна отслеживать внесенных изменений зарегистрированным пользователем-администратором.Хотя это кажется простым (и действительно, документы показывают пример для этого, когда пользовательское поле является частью MainModel), я не могу понять это, когда поле находится во встроенном.
В частности, моя цель:
- Изменения пользователя MainModel
- Пользователь добавляет InlineModel, не заполняя поле пользователя
- Пользователь нажимает сохранить
- Код заполняет поле пользователя для вновь созданных экземпляров InlineModel
- (пользовательское поле «Бонус!» Доступно только для существующих экземпляров и скрыто для новых строк)
И мои вопросы:
- Это правильно?Слишком базовый save_model не вызывается для экземпляров InlineModelAdmin
- Позволяет ли это делать таким образом, чтобы сохранить без возникновения ошибки?(требуется пользователь, проверка помечает его)
- Как я могу скрыть поле ввода пользователя для новых строк и сделать его доступным только для существующих строк?
Вот мои текущие идеи:
#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()