在Django admin中隐藏字段

时间:2010-04-21 18:03:01

标签: django field admin

我试图通过设置 editable = False 来隐藏管理员中的slug字段,但每次我这样做时都会出现以下错误:

KeyError at /admin/website/program/6/
Key 'slug' not found in Form
Request Method: GET
Request URL:    http://localhost:8000/admin/website/program/6/
Exception Type: KeyError
Exception Value:    
Key 'slug' not found in Form
Exception Location: c:\Python26\lib\site-packages\django\forms\forms.py in __getitem__, line 105
Python Executable:  c:\Python26\python.exe
Python Version: 2.6.4

知道为什么会发生这种情况

5 个答案:

答案 0 :(得分:9)

我不能说出你的确切错误,但这对我有用......

from django.template.defaultfilters import slugify
# Create your models here.

class Program(models.Model):
    title=models.CharField(max_length=160,help_text="title of the program")
    description=models.TextField(help_text="Description of the program")
    slug=models.SlugField(max_length=160,blank=True,editable=False)

    def __unicode__ (self):
        return self.title

    class Meta:
        verbose_name="KCDF Program"
        verbose_name_plural="KCDF Programs"

    def save(self):
        self.slug = slugify(self.title)
        super(Program,self).save()

    def get_absolute_url(self):
        return "/program/%s/" % self.slug

当模型被保存时,这将会使你成为一个slug字段。

请忽略ModelAdmin中的自动填充内容。

我在管理员中运行没有问题。

答案 1 :(得分:5)

我的解决方案不仅隐藏了slug字段,还允许在尚未保存的情况下更改slug。问题是prepopulated_fields中使用的字段必须是格式,但如果只读,它们就不存在。如果未设置readonly,则仅通过设置prepopulated_fields来解决此问题。

class ContentAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ('slug',)
        return ()
    def get_prepopulated_fields(self, request, obj=None):
        if not obj:
            return {'slug': ('title',)}
        return {}

答案 2 :(得分:4)

建议在具有额外参数的模型上执行自定义保存方法。

所以代码需要以下内容:

def save(self, *args, **kwargs):
    self.slug = slugify(self.title)
    super(YourModel, self).save(*args, **kwargs)

答案 3 :(得分:2)

而不是使用editable=False只是将它们隐藏在管理员中:

from django.contrib import admin

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

你也可以使用你的模型的“名称”字段(或你想要的任何字段)来保存slug,并且只在你的models.py中使用slugify创建该实例时保存一次:< / p>

from django.template.defaultfilters import slugify

class MyModel(models.Model):
# model fields
...
    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.name)

        super(Product, self).save(*args, **kwargs)

答案 4 :(得分:1)

我知道这是一个非常古老的问题,但我写这篇文章以供将来参考。

如果您只想使用CSS在管理网站中隐藏某些内容,则可以使用已有display:none或类似内容的任何类。

在Django 1.6.5 forms.css中,您可以找到:

.empty-form {
    display: none;
}

因此,在您的字段集中,使用空格式类添加隐藏字段组,如下所示:

fieldsets = [
        [_('Visible class'), {
            'classes' : ['any class for them',],
            'description' : '',
            'fields' : [['visible fields 1',],
                        ['visible fields 2',],
            ],
        }],
        [None, {
            'classes' : ['empty-form',],
            'fields' : ['hidden fields here',],
        }],
    ]

在我的情况下,我正在使用grappelli,所以我使用 ui-helper-hidden 类而不是

祝你有个美好的一天。