5

假设如下:

模型.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)

管理员.py

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

我希望通过标题预先填充 slug,但我不希望用户能够从管理员那里编辑它。我认为将 fields=[] 添加到管理对象而不包括 slug 会起作用,但它没有。我还尝试在模型中设置 editable=False ,但这也不起作用(事实上,停止了页面渲染)。

想法?

4

5 回答 5

4

对于这种特殊情况,您可以覆盖您的 save 方法以 slugify(它是内置方法,查看 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()
于 2008-09-29T15:47:49.380 回答
0

我不确定你要的是什么是可能的。您最好的选择可能是通过指定您的字段集来完全隐藏管理界面中的 slug,而不是覆盖 save 方法以从 tile 复制 slug,并可能对其进行 slugify...

于 2008-09-29T15:04:04.057 回答
0

这个Django Snippet通过定义一个自定义的只读小部件来满足您的需求。因此,您为实际上不允许任何编辑的字段定义了一个自定义编辑器。

于 2008-09-29T15:27:55.387 回答
0

此代码段为您提供了一个 AutoSlugField,其中包含您正在寻找的行为,并且将其添加到您的模型中是单行的。

于 2008-09-29T19:20:53.813 回答
0

除了覆盖save以提供您想要的生成值之外,您还可以在您的类中使用exclude选项ModelAdmin来防止该字段显示在管理员中:

class EntryAdmin(admin.ModelAdmin):
    exclude = ('slug',)
于 2008-09-29T19:36:30.860 回答