2010-04-21 4 views
5

Я привязывание, чтобы скрыть свой слизняк поле в админке, установив редактируемый = False, но каждый раз, когда я делаю это я получаю следующее сообщение об ошибке:Скрыть поля в Django администраторе

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

+0

Я положил их на dpaste http://dpaste.com/186243/ – jwesonga

ответ

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

попробовал, и это сработало !! .. Я думаю, что проблема была в preopulated_fields = {"slug": ("title",)}, как только я удалили его и реструктурировали мои модели, используя приведенный выше пример.Я смог добавить exclude ('slug',) в modelAdmin и скрыть его от пользователя. – jwesonga

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',) 

Вы также можете сделать это так, пробкового сохраняет используя «имя «поле вашей модели (или в любом другом поле, которое вы хотите) и сохраняет только один раз, когда вы создаете этот экземпляр, используя 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, добавить группу для скрытых полей, используя пустую-форму класс как это:

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 вместо

Имейте хорошего дня.

+0

Благодарим за внимание! – Moritz

5

Мое решение не просто спрячет поле пули, но позволяет сменить пул, если он еще не сохранен. Проблема в том, что поля, используемые в prepopulated_fields, должны быть в форме, но их нет, если только в режиме чтения. Это разрешается только установкой 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 {} 
Смежные вопросы