有没有办法定义模型中哪些字段可以在管理应用中编辑?

5 投票
5 回答
353 浏览
提问于 2025-04-11 09:24

假设有以下内容:

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)

admin.py

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

我希望在标题生成的时候,自动填充一个叫做“slug”的字段,但我不想让用户在后台管理中修改这个字段。我原本以为只要在管理对象中添加fields=[]并且不包括slug这个字段就可以了,但结果并没有成功。我还尝试在模型中设置editable=False,但这也没用(实际上,这会导致页面无法正常显示)。

大家有什么想法吗?

5 个回答

0

这个Django代码片段可以满足你的需求,它通过定义一个自定义的只读控件来实现。所以,你可以为这个字段定义一个特殊的编辑器,而这个编辑器实际上是不允许任何编辑的。

0

我不太确定你问的这个事情是否可行。你最好的办法可能是完全在管理界面隐藏这个“slug”(网址的一部分),可以通过设置你的字段组来实现。然后再重写保存的方法,把“slug”从标题中复制过来,并且可能还要把它转换成适合用作网址的格式……

4

在这个特定的情况下,你可以重写你的保存方法,把标题转换成一个简短的、易于识别的字符串(这个功能是内置的,可以查看Django的源代码),然后把这个字符串存储在slug字段里。这样你也可以很方便地检查这个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()

撰写回答