2009-05-21 6 views
3

J'ai 2 modèles.je veux avoir model2 en ligne avec model1. Sur la page d'administration je veux montrer quelques champs du modèle 2 comme inlines et chacun d'entre eux comme readonly.Aussi quand je clique sur le valeur de la ligne i devrait me lier à la model2 avec cette valeurinlines -django

Une ligne qui montrent des champs en lecture seule .Je souhaite montrer les champs de modèle en ligne en lecture seule

Répondre

7

C'est (surtout) facile à faire, merci aux nouvelles formes admin. Fondamentalement, vous devrez créer une sous-classe en ligne personnalisée et remplacer le modèle utilisé pour le rendre dans l'admin. En supposant que vous avez une application appelée app et modèles Model1 et Model2, vous feriez les suivantes:

Tout d'abord, créez votre fichier 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) 

Ensuite, créez le modèle 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> 

Ensuite, ajoutez votre application à INSTALLED_APPS dans settings.py - n'oubliez pas d'ajouter django.contrib.admin trop :).

Enfin, modifiez votre racine urls.py inclure les lignes suivantes:

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

admin.autodiscover() 

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

Cela devrait le faire. Notez que admin.site.urls, ce qui rend l'inversion d'url possible, fonctionnera seulement après le django 1.1.

+0

Pas ce que je cherchais, mais très cool. Je vais devoir ajouter ça à mon livre de trucs. –

Questions connexes