inlines -django - PullRequest
       14

inlines -django

3 голосов
/ 21 мая 2009

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

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

1 Ответ

7 голосов
/ 02 июня 2009

Это (в основном) легко сделать благодаря администратору 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.

...