2012-04-26 5 views
32
class Book(models.Model): 
    title = models.CharField(..., null=True) 
    type = models.CharField(...) 
    author = models.CharField(...) 

У меня есть простой класс в models.py. В админке я хотел бы скрыть название книги (в форме формы книги), когда тип сохраненной книги равен 1. Как это сделать простейшим способом?Как скрыть некоторые поля в django-admin?

+1

Вы можете создать метод ** Book.get_title_or_nothing ** и использовать его в ** BookAdmin ** в показать его –

+0

Хорошо, спасибо, не могли бы вы дать мне пример, как использовать его в BookAdmin? Потому что я знаю общую идею, но не совсем, какой из объектов я должен использовать, что должна вернуть эта функция. – pmoniq

+0

Проблема в том, как получить тип объекта в определении класса BookInline() в admin? – pmoniq

ответ

10

Вы должны создать admin.py в модуле (вероятно книга)

class BookAdmin(admin.ModelAdmin): 
    list_display = ("pk", "get_title_or_nothing") 

В Книга Класс:

class Book: 
    ... 
    def get_title_or_nothing(self): 
     if self.type == WEIRD_TYPE: 
      return "" 
     return self.title 

ОБНОВЛЕНО:

class BookAdmin(admin.ModelAdmin): 
    list_display = ("pk", "get_title_or_nothing") 

    def get_form(self, request, obj=None, **kwargs): 
     if obj.type == "1": 
      self.exclude = ("title",) 
     form = super(BookAdmin, self).get_form(request, obj, **kwargs) 
     return form 
+0

Хорошо, спасибо, но когда я положил это в BookInline, у меня есть ошибка: get_title_or_nothing ', отсутствующая в форме. У вас есть идея? класс BookInline (StackedInline): model = Book fields = ('get_title_or_nothing') – pmoniq

+0

Дело в том, что мне нужно скрыть поле формы, а не значение в списке. Как изменить из editable = True to editable = False, если значение другого поля этого объекта равно 1. – pmoniq

+0

Нехорошее решение, но оно должно работать :) –

71

Скрытые поля непосредственно определены в ОРМ Django путем установки атрибута поле: editable = False

например

class PostCodes(models.Model): 
    gisid = models.IntegerField(primary_key=True) 
    pcname = models.CharField(max_length=32, db_index=True, editable=False) 
    ... 

Однако, установка или изменение полей в модели непосредственно не всегда может быть возможно или advantegous. В принципе, установка admin.py могла бы работать, но не с тех пор, как exclude является опцией InlineModelAdmin.

class PostCodesAdmin(admin.ModelAdmin): 
    exclude = ('pcname',) 
.... 

решение работает по крайней мере, в Django 1.4 (и, вероятно, более поздние версии чисел) является:

class PostCodesAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(PostCodesAdmin, self).get_form(request, obj, **kwargs) 
     del form.base_fields['enable_comments'] 
     return form 

Для администратора списка ракурса пунктов, достаточно просто оставить вне поля не требуется: например

class PostCodesAdmin(admin.ModelAdmin): 
    list_display = ('id', 'gisid', 'title',) 

Для Джанго> 1,8 можно непосредственно установить поля исключаемые:

class PostCodesAdmin(admin.ModelAdmin): 
     exclude = ('pcname',) 
+2

В Django 1.8 exclude = ('fieldname',) работает с admin.ModelAdmin, поэтому вам больше не нужно наследовать от InlineModelAdmin. –

+0

@DmitriySintsov спасибо. Я обновил ответ. –

+0

Также работает в Django 1.7.6 –

Смежные вопросы