Трясогузка Модель 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 }} для него.

Надеюсь, это пригодится,

Роберт

Другие вопросы по тегам