2010-04-21 245 views
5

我绑通过设置隐藏在管理我的蛞蝓领域编辑=假但每次我这样做,我得到以下错误时间:隐藏字段

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

你能展示你的模型和你的模型,窗体和视图吗? – Brant 2010-04-21 18:28:59

+0

我把它们放在dpaste http://dpaste.com/186243/ – jwesonga 2010-04-21 18:34:14

回答

8

我不能说你确切的错误,但这个工作对我来说...

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 

时保存的模式,将抽你了蛞蝓场。

只需在ModelAdmin中省略自动填充的内容即可。

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

+0

试过了,它工作了!!我认为prepopulated_fields = {“slug”:(“title”,)}是问题,一旦我删除它,并使用上面的示例重新构建我的模型。我能够在modelAdmin中添加排除('slug'),并将其从用户隐藏。 – jwesonga 2010-04-21 19:20:03

4

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

因此,代码就会像下面这样:

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

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

from django.contrib import admin 

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

你也可以把它使塞保存使用“名称“(或任何你想要的字段),并且只在你的models.py中使用slugify创建该实例时只保存一次:

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) 
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,所以我使用辅助隐藏类而不是

祝你有美好的一天。

+0

谢谢你指出这一点! – Moritz 2014-10-02 07:26:07

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 {}