Django InlineModelAdmin: Покажите частично встроенную модель и ссылку на полную модель

Я определил несколько моделей: Журналы, объемы, volume_scanInfo и т.д.

Журнал может иметь больше объемов, и объем может иметь больше scanInfo.

То, что я хочу сделать:

  • на администраторской странице журналов я хочу иметь список объемов, встроенных (сделанный)
  • соедините каждый объем предыдущего списка к его администраторской странице, где я могу показать форму для редактирования объема и списка его "информации о сканировании", встроенной.

таким образом, я хочу иметь что-то как:

Journal #1 admin page
[name]
[publisher]
[url]
.....
list of volumes inline
    [volume 10] [..(other fields)..]   <a href="/link/to/volume/10">Full record</a>
    [volume 20] [..(other fields)..]   <a href="/link/to/volume/20">Full record</a>

Затем

Volume #20 admin page
[volume number]
[..(other fields)...]
......
list of the scan info inline
    [scan info 33] [..(other fields)..]   <a href="/link/to/scaninfo/33">Full record</a>
    [scan info 44] [..(other fields)..]   <a href="/link/to/scaninfo/44">Full record</a>

То, что я пытался сделать, определяет образцовый метод, которые создают код и пытающийся использовать его в классе, который определяет "объем, встроенный" в администраторе, но он не работает.

Другими словами,

модель "Volume" имеет в чем-то как:

def selflink(self):
    return '<a href="/admin/journaldb/volume/%s/">Full record</a>' % self.vid
selflink.allow_tags = True

и

class VolumeInline(admin.TabularInline):
    fields = ['volumenumber', 'selflink']
    model = Volume
    extra = 1

Но это дает следующую ошибку:

Exception Value: 'VolumeInline.fields' refers to field 'selflink' that is missing from the form.

Какая-либо идея?

Спасибо, Giovanni

32
задан Serjik 19 December 2015 в 09:11
поделиться

1 ответ

Специальные переменные Perl перечислены в perlvar .

-121--3338972-

Я бы поставил утверждение .

Special make_special( Enum e )
{
    switch( e )
    {
        case Enum_One:
            return Special( /*stuff one*/ );

        case Enum_Two:
            return Special( /*stuff two*/ );

        default:
            assert(0 && "Unhandled special enum constant!");
    }
}

Если значение перечисления не обрабатывается, в то время как предполагается охватить все случаи, это ошибка в коде, которую необходимо исправить. Ошибка не может быть устранена из или обработана «изящно» и должна быть исправлена сразу (так что я бы не бросил). Для того, чтобы компилятор молчал о предупреждениях «return no value», вызовите abort , например

#ifndef NDEBUG
#define unreachable(MSG) \
  (assert(0 && MSG), abort())
#else
#define unreachable(MSG) \
  (std::fprintf(stderr, "UNREACHABLE executed at %s:%d\n", \
                __FILE__, __LINE__), abort())
#endif 

Special make_special( Enum e )
{
    switch( e )
    {
        case Enum_One:
            return Special( /*stuff one*/ );

        case Enum_Two:
            return Special( /*stuff two*/ );

        default:
            unreachable("Unhandled special enum constant!");
    }
}

Нет предупреждений компилятора о возврате без значения, потому что он знает, что abort никогда не возвращается. Мы немедленно прекращаем проваленную программу, что является единственной разумной реакцией, на мой взгляд (нет смысла пытаться продолжать запускать программу, которая вызвала неопределенное поведение).

-121--1855989-

ОБНОВЛЕНИЕ: Начиная с Django 1.8, это встроено.

См. этот ответ и в официальной документации .

СТАРЫЙ ОТВЕТ:

В конце я нашел простое решение.

Я создаю новый шаблон с именем linked.html , который является копией tabular.html , и добавил этот код для создания ссылки.

{% if inline_admin_form.original.pk %}
          <td class="{{ field.field.name }}">
              <a href="/admin/{{ app_label }}/{{ inline_admin_formset.opts.admin_model_path }}/{{ inline_admin_form.original.pk }}/">Full record</a>
          </td>
{% endif %}

Затем я создал новую модель LinkedInline , наследующую InLineModelAdmin

#override of the InlineModelAdmin to support the link in the tabular inline
class LinkedInline(admin.options.InlineModelAdmin):
    template = "admin/linked.html"
    admin_model_path = None

    def __init__(self, *args):
        super(LinkedInline, self).__init__(*args)
        if self.admin_model_path is None:
            self.admin_model_path = self.model.__name__.lower()

Тогда при определении новой встроенной модели мне придется использовать только LinkedInline вместо обычного InLineModelAdmin .

Надеюсь, это может быть полезно для других людей.

Джованни

29
ответ дан 27 November 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: