我有两个模型,一个主模型和一个相关的内联模型,我想在管理中作为内联显示。这个inlinemodel可以用来,比如,做关于模型的笔记,并且应该跟踪登录的管理员用户所做的更改。虽然这看起来很简单(事实上,当用户字段是主模型的一部分时,文档显示了一个这样的例子),但是当字段位于内联时,我似乎无法理解它。
具体来说,我的目标是:
用户编辑主模型
用户添加一个内联模型,而不是填充用户字段
用户按保存
代码为新创建的inlinemodel实例填充用户字段
(奖金!用户字段对于现有实例是只读的,对于新的内联是隐藏的)
我的问题是:
这是正确的吗?它的too bas save_模型没有为inlinemodeladmin实例调用
这样做是否允许我保存而不会导致错误?(用户是必需的,验证标记它)
如何隐藏新inline的用户输入字段,并使其对现有inline为只读?
以下是我目前的想法:

#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元组中包含“user”字段,但这样不会显示现有inlinemodel实例的作者。(编辑:在此处将“用户”添加到只读字段)
(edit)如何使现有的inline将“data”呈现为只读,但在添加新的inline时仍能对其进行编辑?

关于python - Django InlineModelAdmin - 在保存请求时设置内联字段(自动设置用户字段)(save_formset vs save_model),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3016158/

10-12 18:18
查看更多