Скрыть поля в админке Django - PullRequest
5 голосов
/ 21 апреля 2010

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

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 ]

9 голосов
/ 21 апреля 2010

Я не могу говорить с вашей точной ошибкой, но это сработало для меня ...

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.

У меня это работало в админе без проблем.

5 голосов
/ 09 декабря 2015

Мое решение не просто скрывает поле слагов, но позволяет менять слаг, если он еще не сохранен. Проблема в том, что поля, используемые в prepopulated_fields, должны быть в форме, но их там нет, если они доступны только для чтения. Это решается только установкой prepopulated_fields, если не установлено readonly.

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 {}
4 голосов
/ 07 декабря 2011

Рекомендуется использовать собственный метод сохранения для моделей с дополнительными аргументами.

Таким образом, код хотел бы следующее:

def save(self, *args, **kwargs):
    self.slug = slugify(self.title)
    super(YourModel, self).save(*args, **kwargs)
2 голосов
/ 30 сентября 2013

Вместо использования editable=False просто скройте их в админке:

from django.contrib import admin

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

Вы также можете сделать так, чтобы слаг сохранял, используя поле «name» вашей модели (или любое другое поле, которое вы хотите), и сохранял только один раз, когда вы создаете этот экземпляр с помощью slugify следующим образом в вашем models.py:

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 голос
/ 11 июня 2014

Я знаю, что это очень старый вопрос, но я пишу его для будущих ссылок.

Если вы просто хотите что-то скрыть на сайте администратора с помощью CSS, вы можете использовать любой класс, который уже имеет display:none или аналогичный.

В Django 1.6.5 forms.css вы можете найти:

.empty-form {
    display: none;
}

поэтому в ваших наборах полей добавьте группу для скрытых полей, используя empty-form class, подобный этому:

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

Хорошего дня.

...