Django: отображение только текста формы в админке - PullRequest
1 голос
/ 16 июня 2009

Хорошо для чего-то, что звучит легко, у меня возникли проблемы с поиском ответа. У меня есть эта модель:

class Page(models.Model):
    creator       = models.TextField(blank=False)
    name          = models.CharField(max_length=70, primary_key=True)
    name_slug     = models.SlugField(max_length=70, unique=True)

всякий раз, когда я сохраняю в admin, я выполняю операцию предварительного сохранения (save_model ()), которая передает вставленное значение name + creator (например: i_am_legend_cyber_valdez) в name_slug, что я хочу сделать, это полностью создать текстовое поле name_slug в admin только текст, не играя с шаблонами администратора. Возможно ли это?

1 Ответ

2 голосов
/ 16 июня 2009

Либо в вашем ModelAdmin.formfield_overrides, либо в ModelAdmin.formfield_for_dbfield, либо в пользовательской ModelForm, вам нужно назначить пользовательский виджет для поля name_slug, которое просто отображает значение поля, а не отображает ввод формы HTML. Вы можете найти именно такой виджет здесь .

РЕДАКТИРОВАТЬ : я не буду вдаваться в подробности создания пользовательского виджета, так как вы можете просто использовать тот, на который я ссылался выше. Чтобы включить этот виджет для всех SlugField в модели, проще всего использовать formfield_overrides :

class PageAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.SlugField: {'widget': ReadOnlyWidget},
    }

Если у вас есть несколько полей SlugFields в вашей модели и вы хотите применить ReadOnlyWidget только к одному из них, вы должны переопределить метод formfield_for_dbfield:

class PageAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'name_slug':
            kwargs['widget'] = ReadOnlyWidget
        return super(PageAdmin, self).formfield_for_dbfield(db_field, **kwargs)

Вы также можете создать полностью настраиваемую ModelForm для своей модели и назначить ее атрибуту формы вашего ModelAdmin, но в этом нет необходимости, если вы не выполняете более глубокие настройки.

...