Трясогузка Модель Admin встроенная?
Я использую модуль ModelAdmin из трясогузки (не такой как Django ModelAdmin), чтобы добавить пользовательский Order
модель для трясогузки админ. Эта модель имеет внешний ключ на заказ Address
модель.
Я хотел бы отобразить Address
модель как встроенная (как в админке Django) в InspectView
(который я включил). В настоящее время он отображает строковое представление.
2 ответа
Фон
Вы должны создать класс, наследуя класс, и указать модель, связанную с этим . ЭтоModelAdmin
основы, и вы можете найти его в документации . Также основы Inspect View можно найти в этой документации .
class OrderAdmin(ModelAdmin):
model = Order
inspect_view_enabled = True
inspect_view_fields = (
'id',
'date',
)
У меня эта модель называется и мне нужно отобразить толькоid
иdate
в режиме осмотра трясогузки. Также у меня есть модель с отношением один к одному к модели. Мне нужно показать это в режиме проверки.
Отвечать
Но если просто добавить новое поле, подобное следующему, оно выдаст ошибку, какwagtail
не могу найти поле под названиемcity
в модели.
inspect_view_fields = (
'id',
'date',
'city',
)
Как трясогузка разрешает поля
Для каждого поля вinspect_view_fields
массив, трясогузка вызывает метод с именемget_dict_for_field
чтобы получить связанную метку и значение для этого поля. Вы можете легко переопределить этот метод. После переопределения вы должны указать трясогузке использовать переопределенный метод. Вы можете сделать это следующим образом.
class OrderInspectView(InspectView):
def get_dict_for_field(self, field_name): # Override to support custom fields
# Do the implementation for custom fields
return super().get_dict_for_field(field_name)
class OrderAdmin(ModelAdmin):
model = Order
inspect_view_enabled = True
inspect_view_class = OrderInspectView # Tell wagtail to use our class instead of the default class
inspect_view_fields = (
'id',
'name',
'city', # Custom field
)
Что вам нужно сделать сейчас, так это получитьAddress
связанные с и вернуть его. Вы можете получить текущую проверкуOrder
с использованиемself.instance
.
def get_dict_for_field(self, field_name):
if field_name == 'city':
qs = Address.objects.filter(order=self.instance.id)
value = str(qs[0].city) if len(qs) > 0 else '-'
return {
'label': 'City',
'value': value,
}
return super().get_dict_for_field(field_name)
Я не часто использовал InspectView, но он представляет модель как повторно обработанный шаблон без fielsd и т. Д. Поэтому, возможно, вы можете определить свой собственный шаблон и вызвать собственное свойство из Order {{ value.bound_blocks.order.full_addres }} для него.
Надеюсь, это пригодится,
Роберт