2009-05-21 7 views
3

Ich habe 2 models.i möchte model2 inline mit model1 haben. Auf der Admin-Seite möchte ich einige Felder von Modell 2 als Inlines und alle von ihnen als readonly.ALso zeigen, wenn ich auf die klicken Wert des Inline-i sollte mich auf den model2 mit diesem Wert verknüpfeninlines-django

Ein Inline, die Felder zeigen Nur-Lese-.Ich möchte Felder Inline-Modell zeigen, wie Nur-Lese-

Antwort

7

Dies ist (meist) einfach zu tun, dank zu newforms admin. Grundsätzlich müssen Sie eine benutzerdefinierte Inline-Unterklasse erstellen und die Vorlage überschreiben, die zum Rendern im Admin verwendet wird. Angenommen, Sie haben eine App app und Modelle Model1 und Model2 genannt, würden Sie wie folgt vorgehen:

Erstellen Sie zunächst Ihre admin.py Datei:

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) 

Erstellen Sie dann die inline.html Vorlage bei 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> 

Als nächstes Ihre App INSTALLED_APPS in settings.py hinzufügen - vergessen Sie nicht django.contrib.admin auch zu addieren :).

Schließlich bearbeiten Sie Ihre Wurzel urls.py die folgenden Zeilen enthalten:

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

admin.autodiscover() 

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

Das sollte es tun. Beachten Sie, dass admin.site.urls, die die URL-Umkehrung möglich macht, nur nach Django 1.1 funktioniert.

+0

Nicht was ich suchte, aber sehr cool. Ich muss das zu meinem Trickbuch hinzufügen. –