2010-04-21 244 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 {}