встроенные -django

У меня есть 2 модели. Я хочу, чтобы модель 2 была встроена в модель 1. На странице администратора я хочу показать некоторые поля модели 2 как встроенные, и все они только для чтения. Также, когда я нажимаю на значение встроенного, я должен свяжите меня с моделью2 с этим значением

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


person ha22109    schedule 21.05.2009    source источник


Ответы (1)


Это (в основном) легко сделать благодаря администратору newforms. По сути, вам нужно создать собственный встроенный подкласс и переопределить шаблон, используемый для его отображения в админке. Предполагая, что у вас есть приложение под названием app и модели Model1 и Model2, вы должны сделать следующее:

Сначала создайте файл admin.py:

from django.contrib import admin
from app.models import Model1, Model2

class Model2Admin(admin.ModelAdmin):
    list_display = (...)

class Model2Inline(admin.TabularInline):
    model = Model2
    extra = 0
    template = 'admin/app/model2/inline.html'

class Model1Admin(admin.ModelAdmin):
    list_display = (...)
    inlines = (Model2Inline,)

admin.site.register(Model1, Model1Admin)
admin.site.register(Model2, Model2Admin)

Затем создайте шаблон inline.html в admin/app/model2:

{% load i18n %}
<div class="inline-group">
  <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
    {{ inline_admin_formset.formset.management_form }}
    <fieldset class="module">
      <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst|escape }}</h2>
      {{ inline_admin_formset.formset.non_form_errors }}
      <table>
        <thead>
          <tr>
            <th colspan="2">Field1</th>
            <th>Field2</th>
            <th>Field3</th>
          </tr>
        </thead>

        {% for inline_admin_form in inline_admin_formset %}
          <tr class="{% cycle row1,row2 %}">
            <td class="original">
              <!-- Render all form fields as hidden fields: -->
              {{ inline_admin_form.pk_field.field }}
              {% spaceless %}
              {% for fieldset in inline_admin_form %}
                {% for line in fieldset %}
                  {% for field in line %}
                    {{ field.field.as_hidden }}
                  {% endfor %}
                {% endfor %}
              {% endfor %}
              {% endspaceless %}
            </td>

            <!-- then display just the values of the fields you're interested in: -->
            <td class="field1">
              <!-- Make this a link to the change detail page for this object: -->
              <a href="{% url admin:app_model2_change inline_admin_form.original.pk %}">{{ inline_admin_form.original.field1 }}</a>
            </td>
            <td class="field2">
              {{ inline_admin_form.original.field2 }}
            </td>
            <td class="field3">
              {{ inline_admin_form.original.field3 }}
            </td>
        </tr>
      {% endfor %}
      </table>
    </fieldset>
  </div>
</div>

Затем добавьте свое приложение в INSTALLED_APPS в settings.py — не забудьте также добавить django.contrib.admin :).

Наконец, отредактируйте корневой каталог urls.py, включив в него следующие строки:

from django.conf.urls.defaults import *
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
   ...
   (r'^admin/', include(admin.site.urls))
)

Это должно сработать. Обратите внимание, что admin.site.urls, который делает возможным изменение URL-адреса, будет работать только после django 1.1.

person elo80ka    schedule 02.06.2009
comment
Не то, что я искал, но очень круто. Я должен добавить это в свою книгу трюков. - person T. Stone; 14.08.2009