有没有一种方法可以定义模型中的哪些字段可以在管理应用中进行编辑?

时间:2020-03-06 14:52:42  来源:igfitidea点击:

假设以下内容:

models.py

class Entry(models.Model):
    title = models.CharField(max_length=50)
    slug = models.CharField(max_length=50, unique=True)
    body = models.CharField(max_length=200)

管理员

class EntryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug':('title',)}

我希望标题中预先填充了子弹,但我不希望用户能够从管理员中对其进行编辑。我认为将fields = []添加到管理对象中并且不包括子弹是可行的,但是没有成功。我还尝试在模型中设置editable = False,但这也没有起作用(实际上,阻止了页面的渲染)。

有什么想法吗?

解决方案

我不确定我们要的是什么。最好的选择可能是通过指定字段集来从管理界面中完全隐藏该段子,而不是重写save方法从磁贴中复制该段子,并可能对其进行段子化。

该Django代码段通过定义自定义只读窗口小部件来实现我们想要的功能。因此,我们为该字段定义了一个自定义编辑器,实际上该编辑器不允许进行任何编辑。

对于这种特殊情况,我们可以覆盖save方法以显示标题(它是内置方法,请参见django源代码),并将标题存储在slug字段中。此外,我们还可以从那里轻松检查该段是否确实是唯一的,并以某种方式对其进行更改(如果不是)。

考虑以下示例:

def save(self):
    from django.template.defaultfilters import slugify

    if not self.slug:
        self.slug = slugify(self.title)

    super(Your_Model_Name,self).save()

此代码段为我们提供了一个AutoSlugField,它具有我们要查找的行为,并且将其添加到模型中是一种方法。

除了覆盖save以提供所需的生成值之外,我们还可以在ModelAdmin类中使用exclude选项,以防止在admin中显示该字段:

class EntryAdmin(admin.ModelAdmin):
    exclude = ('slug',)