У меня есть две модели, MainModel и связанный InlineModel, который я хотел бы показать как встроенное в администраторе. Этот InlineModel может использоваться для того, чтобы, скажем, сделать примечания о модели и должен отследить зарегистрированного администраторского пользователя, вносящего изменения. В то время как это кажется простым (и действительно, документы показывают пример для этого, когда пользовательское поле является частью MainModel), я, может казаться, не схватываю его, когда поле идет Встроенное.
Чтобы быть конкретной, моя цель:
И мои вопросы:
Вот мои текущие идеи:
#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()
Я решил первую половину своего вопроса:
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()
Теперь меня интересует бонусное поведение:
Мне нужно выбрать пользователя при добавлении нового встроенного к правилам проверки. Мое лучшее предположение - не включать поле «пользователь» в мой кортеж InlineModelInline.fields, но тогда это не покажет автора для существующих экземпляров InlineModel. (Правка: здесь работает добавление "пользователя" в readonly_fields)
(Правка) Как я могу сделать существующие встроенные строки отображать "данные" только для чтения, но при этом иметь возможность редактировать их при добавлении новой встроенной строки?