2010-01-19 6 views

Antwort

2

Ich denke, dies mit einem einfachen Schalter in der InlineAdmin Unterklasse nicht möglich ist. Aber ich kann mich einen kleinen „Hack“, dass das gleiche erreicht:

Verwenden Sie das template Attribut auf Ihrem InlineAdmin ein eigenes Template zu spezifizieren Ihre inlines zu machen. Kopieren Sie nun die ursprüngliche Vorlage, die Sie verwenden möchten, in Ihre benutzerdefinierte Vorlage (z. B. Kopie django/contrib/admin/templates/admin/edit_inline/tabular.html). Schauen Sie sich die Quelle an und finden Sie die Zeile mit {% for inline_admin_form in inline_admin_formset %} und fügen Sie danach {% if not inline_admin_form.original %} ein. Fügen Sie auch {% endif %} kurz vor dem abschließenden {% endfor %} Tag ein.

Diese Methode verbirgt tatsächlich nur die Ausgabe der Inlines. So ist es immer noch möglich zu ändern, indem Sie rohe POST-Daten an die Seite übergeben, zum Beispiel mit curl (aber der "Angreifer" [lesen: Admin-Benutzer ;-)] muss django wissen und wie es erzeugt die Feldnamen in Formsets) .

Die tabular.html aussehen könnte nun wie folgt aus:

{% 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> 
+2

ich denke, dass es sauberer Möglichkeiten, diesen Code in Python zu tun, indem Sie eine BaseInlineFormset Unterklasse zu machen, dass zeigt niemals vorhandene Daten an und überschreibt die richtige Methode in Ihrer Unterklasse admin.ModelInline, damit sie Ihre Formset-Klasse verwendet. –

+0

Ja, ich stimme zu. Daran habe ich nicht gedacht. Vielleicht muss ich weniger Erfahrung mit Formsets haben. Der Ansatz der Unterklasse ist natürlich viel sauberer und nicht so sehr ein "Hack". –

1
from django.forms.models import inlineformset_factory 

und dann

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) 
Verwandte Themen