【发布时间】:2011-03-02 06:20:14
【问题描述】:
我有两个模型,一个 MainModel 和一个相关的 InlineModel,我想在管理员中显示为内联模型。这个 InlineModel 可以用于,比如说,对模型做注释,并且应该跟踪登录的管理员用户所做的更改。虽然这看起来很简单(事实上,当用户字段是 MainModel 的一部分时,文档显示了一个示例),但当该字段位于内联时,我似乎无法掌握它。
具体来说,我的目标是:
- 用户编辑 MainModel
- 用户添加了一个 InlineModel,而不是填写用户字段
- 用户按下保存键
- 代码填写新创建的 InlineModel 实例的用户字段
- (奖励!用户字段对于现有实例是只读的,对于新的内联是隐藏的)
还有我的问题:
- 这是正确的吗? InlineModelAdmin 实例也不会调用它的基础 save_model
- 这样做是否可以让我保存而不会导致错误? (用户是必需的,验证标记它)
- 如何隐藏新内联的用户输入字段,并将现有内联设为只读?
这是我目前的想法:
#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()
【问题讨论】:
标签: python django django-admin inline