我试图通过设置 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
知道为什么会发生这种情况
答案 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 类而不是
祝你有个美好的一天。