2009-06-15 3 views
1

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

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) 

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

+1

Я не уверен, что вы подразумеваете под «только для текста». Вы хотите, чтобы он отображал его, но вы не можете редактировать значение name_slug? – bchang

+0

хорошо оба случая должны работать нормально, но я также люблю альтернативу обычного текста, если это возможно – cybervaldez

ответ

2

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

EDIT: Я не буду вдаваться в подробности создания пользовательского виджета, так как вы можете просто использовать тот, с которым я связан выше. Чтобы включить этот виджет для всех 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, но это не является необходимым, если вы не делаете более глубокие настройки.

+0

Хм, вы можете научить меня, как я видел документацию по виджетам, но это не так хорошо документировано. http://docs.djangoproject.com/en/dev/ref/forms/widgets/ – cybervaldez