Управление одной моделью из контекста другой в Django Admin

#django #django-admin

#django #django-admin

Вопрос:

Возможно, это даже невозможно, но что-то подсказывает мне, что я просто еще не придумал, как это сделать. В качестве упрощенного примера я буду использовать концепцию блога.

В представлении списка изменений есть несколько блогов. Я выбираю один блог для редактирования, и в окне изменения я вижу список изменений записей, принадлежащих этому блогу. Когда я добавляю / редактирую запись оттуда, он знает, к какому блогу она принадлежит, либо по URL, либо каким-либо другим способом передачи контекста.

Я знаю, как настроить шаблоны администратора для достижения того, чего я хочу, но я ни за что на свете не смогу понять, как передать идентификатор контекстного объекта в представление дочернего объекта. Есть предложения?

Редактировать:

Извините, ребята. Основываясь на ответах, которые я получаю, я, должно быть, был недостаточно конкретен.

Встроенные строки — это не то, что я ищу. Каждый из дочерних объектов содержит много данных. Использование встроенных строк приводит к тому, что страница прокручивается вечно, и нет возможности легко получить доступ к определенному объекту. Мне нужно иметь вид в стиле списка изменений (где были бы встроенные строки), и нажатие на ссылку там приведет вас к обычному представлению изменений для объекта, при этом каким-то образом передавая идентификатор контекстного объекта в представление.

Например. Если бы я зашел в определенный блог, URL-адрес был бы чем-то вроде:

 /admin/blog/blog/1/
  

Затем оттуда я нажимаю на сообщение, и URL, на который я отправляюсь, выглядит примерно так:

 /admin/blog/blog/1/post/1/
  

Идентификатор блога ( 1 в этом примере) был бы доступен для объекта post, чтобы я мог сохранить внешний ключ его блога. Это также не обязательно должно выполняться с помощью URL-адресов. Мне просто нужен какой-то метод предоставления контекста редактируемому сообщению, который находится в контексте блога с этим идентификатором.

Ответ №1:

Проблема с передачей parent_id имеет отношение только к странице «создать новую», верно? Для любой существующей модели мы уже знаем этот идентификатор.

Давайте разделим проблему на 2 части: 1. Передайте parent_id на новую страницу 2. Прочитайте parent_id на новой странице и соответствующим образом измените форму

Хорошее надежное решение включало бы изменение представлений администратора как для родительской, так и для дочерней моделей. Слишком много работы, учитывая, насколько сложны эти представления, когда вы смотрите на исходный код. Итак, я бы лично согласился с быстрым и грязным взломом JS:

  1. Добавьте parent_id в качестве параметра get к ссылкам в списках изменений.

     $("#changelists_container .link_class").each(function(i,link){
      link.attr("href", link.attr("href")   "?parent_id=" parentId; // assumes no other GET params
    });
      
  2. На дочерней странице, если в GET params есть parent_id, используйте JS для установки значения поля. Это все равно позволит пользователю изменить его позже. Если вы не хотите, чтобы значение поля можно было изменять, отключите поле и создайте новое скрытое поле с тем же именем и parent_id в качестве значения.

Комментарии:

1. Я начинаю думать, что вы правы. Я бы, вероятно, добавил параметр GET в шаблон, вместо того чтобы полагаться на JS, но, похоже, это единственный разумный способ добиться этого. Ранее я просмотрел исходный код для ModelAdmin , и хотя я, вероятно, мог бы изменить переопределение представлений, чтобы это произошло, мне пришлось бы почти вставить весь исходный код в переопределение, которое кричит «нет-нет».

Ответ №2:

Итак, вы хотите создать ссылку на представление изменений из администратора? Это должно помочь:

 {% url admin:app_model_change object.pk %}
  

Ответ №3:

Посмотрите на строки администратора:http://docs.djangoproject.com/en/1.3/ref/contrib/admin/#inlinemodeladmin-objects

Они позволяют добавлять дочерние объекты на страницу сведений о родительском объекте.