Можно ли встроить администратора без отображения оригинальных данных? - PullRequest
5 голосов
/ 19 января 2010

В админке django у меня есть модель со встроенным. Я хотел бы иметь возможность показывать только «добавить новые» строки для встроенного, и не показывать какие-либо ранее существующие исходные данные в таблице, принадлежащей встроенному. Это возможно? Я пробовал каждую комбинацию max_num и extra, и она всегда показывает существующие данные таблицы.

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Я думаю, что это невозможно с простым переключателем в InlineAdmin подкласс. Но я могу подумать о маленьком «хаке», который добивается того же:

Используйте атрибут template на InlineAdmin, чтобы указать пользовательский шаблон сделать ваши строки. Теперь скопируйте оригинальный шаблон, который вы хотите использовать в Ваш пользовательский шаблон (например, копия django/contrib/admin/templates/admin/edit_inline/tabular.html). Посмотрите на найти и найти строку с {% for inline_admin_form in inline_admin_formset %} и вставить {% if not inline_admin_form.original %} после этого. Также вставьте {% endif %} прямо перед закрытием {% endfor %} тег.

Этот метод фактически скрывает вывод строк. Так что все еще возможно изменить их, передав необработанные данные POST на страницу, например, с помощью curl (но «злоумышленник» [читай: admin user ;-)] должен знать django и как он генерирует имена полей в наборах форм).

tabular.html может выглядеть теперь так:

{% 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 }}</h2>
   {{ inline_admin_formset.formset.non_form_errors }}
   <table>
     <thead><tr>
     {% for field in inline_admin_formset.fields %}
       {% if not field.is_hidden %}
         <th {% if forloop.first %}colspan="2"{% endif %}>{{ field.label|capfirst }}</th>
        {% endif %}
     {% endfor %}
     {% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
     </tr></thead>

     <tbody>
     {% for inline_admin_form in inline_admin_formset %}
     {% if not inline_admin_form.original %}
        {% if inline_admin_form.form.non_field_errors %}
        <tr><td colspan="{{ inline_admin_form.field_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
        {% endif %}
        <tr class="{% cycle row1,row2 %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}">

        <td class="original">
          {% if inline_admin_form.original or inline_admin_form.show_url %}<p>
          {% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %}
          {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}
            </p>{% endif %}
          {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
          {{ inline_admin_form.fk_field.field }}
          {% spaceless %}
          {% for fieldset in inline_admin_form %}
            {% for line in fieldset %}
              {% for field in line %}
                {% if field.is_hidden %} {{ field.field }} {% endif %}
              {% endfor %}
            {% endfor %}
          {% endfor %}
          {% endspaceless %}
        </td>

        {% for fieldset in inline_admin_form %}
          {% for line in fieldset %}
            {% for field in line %}
              <td class="{{ field.field.name }}">
              {{ field.field.errors.as_ul }}
              {{ field.field }}
              </td>
            {% endfor %}
          {% endfor %}
        {% endfor %}

        {% if inline_admin_formset.formset.can_delete %}
          <td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
        {% endif %}

        </tr>

     {% endif %}
     {% endfor %}
     </tbody>
   </table>

</fieldset>
  </div>

  {# <ul class="tools"> #}
  {#   <li><a class="add" href="">Add another {{ inline_admin_formset.opts.verbose_name|title }}</a></li> #}
  {# </ul> #}

</div>
1 голос
/ 14 февраля 2011
from django.forms.models import inlineformset_factory

, а затем

class ModelNameInlineFormSet(BaseInlineFormSet):
    def __init__(self, **kwargs):
        super(ModelNameInlineFormSet, self).__init__(**kwargs)
        self.queryset = ModelName.objects.none()

class ModelNameInline(admin.TabularInline):
    formset = inlineformset_factory(ParentModelName, ModelName, 
                                    formset=ModelNameInlineFormSet)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...