Django管理员仅读取现有字段,但如果单击+添加另一个字段,则允许添加新内联

时间:2014-04-03 14:23:24

标签: django admin inline readonly

我知道,问过这个问题,但我不清楚。

我把所有字段都放在了“只读字段”字段中。 Essai_TemperatureInline

我想在管理员中为当前用户创建的记录添加新的内联。

如果我想添加新记录怎么办?

class Essai_TemperatureInline(admin.TabularInline):
    model = Essai_Temperature
    extra = 5
    ordering = ('choix__name', 'choix__lapropriete',)

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser == False:
            notBelongToMe = Material.objects.exclude(user=request.user)
            jj = 0
            if obj:
                while jj < len(notBelongToMe):
                    if notBelongToMe[jj] == obj:
                        return self.readonly_fields + (
                            'name',
                            'nature_unit',
                            'choix',
                            'valT',
                            'val10',
                            'val_ref',
                        )
                    jj += 1

    return self.readonly_fields

class MaterialAdmin(admin.ModelAdmin):
    inlines = (MediaInline, UniteProperty2Inline, Essai_TemperatureInline)

2 个答案:

答案 0 :(得分:3)

不幸的是,你做不到。至少不是很好的方式,通过Python,如你所知how to do it with regular ModelAdmin。这是管理员中的一个错误,记录在Ticket #15602

您可以做的是使用JavaScript。使用此选择器:

.inline-group tr.has_original

has_original类应用于表示已保存模型实例的每个内联。

所以,在Essai_TemperatureInline类中,让所有字段都可编辑(非readonly),然后使用JS(jQuery,我猜)将一些字段只读:

django.jQuery('.inline-group tr.has_original #id_somefield').attr('readonly', 'readonly');

请参阅The Documentation,了解如何将自己的JS添加到管理页面。基本上是:

class ArticleAdmin(admin.ModelAdmin):
    class Media:
        css = {
            "all": ("my_styles.css",)
        }
        js = ("my_code.js",)

安全说明:

使用Firebug或类似的浏览器工具显然很容易被欺骗。因此,请务必在必要时考虑这一点,并进行一些检查,可能是formset.clean()

上的某个地方

答案 1 :(得分:0)

如果你真的不在乎该字段是否只读,但只需要阻止用户更改字段,我找到了workaround

在内联模型表单的clean方法中引发了一个可用的错误:

{{1}}