2010-01-08 8 views
16

पर 'पतन' कैसे जोड़ें, उसी तरह आप अपने मॉडलएडमिन फ़ील्ड में से एक में 'कक्षाएं': ['पतन'] जोड़ सकते हैं, मैं एक इनलाइन मॉडल व्यवस्थापक होना चाहता हूं सिमटने।Django StackedInline

यह टिकट, Collapse in admin interface for inline related objects, बिल्कुल वही चर्चा करता है जो मैं पूरा करना चाहता हूं। लेकिन इस बीच, अगली रिलीज की प्रतीक्षा करते समय, सबसे अच्छा काम क्या है?

एफवाईआई: मैं एक समाधान के साथ आया हूं, लेकिन मुझे लगता है कि एक बेहतर एक मौजूद है। मैं वोटिंग का ख्याल रखूंगा।

+0

ध्यान दें, समाधान है कि जे एस (और मेरे वर्तमान एक करता है) में ऐसा क्षेत्र सेट उन में त्रुटियाँ हैं कि पतन नहीं करना चाहिए! –

उत्तर

2

यहां मैंने इसे हल किया है, लेकिन यह हैक (हैक के लिए) की तरह बहुत अधिक लगता है।

मैंने डीजेओ को संशोधित करने के लिए Google एपीआई से होस्ट किए गए jQuery का उपयोग किया, जो डीजेगो की अपनी 'शो/छुपा' स्क्रिप्ट का लाभ उठा रहा था। आप एक व्यवस्थापक पृष्ठ के HTML स्रोत को देखें, तो पिछले स्क्रिप्ट लोड यह है: अपने ही डोम-फेरबदल स्क्रिप्ट लोड करने के लिए उत्तोलन ModelAdmin media definitions:

<script type="text/javascript" src="/media/admin/js/admin/CollapsedFieldsets.js"></script> 

कि फ़ाइल में टिप्पणी मुझे विचार प्रदान किया।

from django.contrib import admin 
from django.contrib.admin.sites import AdminSite 
from myapp.models import * 
import settings 
media = settings.MEDIA_URL 

class MyParticularModelAdmin(admin.ModelAdmin): 
    # ..... 
    class Media: 
      js = ('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js', 
       media+'js/addCollapseToAllStackedInlines.js') 
# ..... 

और फिर संदर्भित जावास्क्रिप्ट फ़ाइल के अंदर:

// addCollapseToAllStackedInlines.js 
$(document).ready(function() { 
    $("div.inline-group").wrapInner("<fieldset class=\"module aligned collapse\"></fieldset>"); 
}); 

अंत परिणाम केवल StackedInline, नहीं TabularInline पर काम करता है।

+0

यह आदेश जावास्क्रिप्ट को निष्पादित करता है (यह django के पहले) और हमेशा काम नहीं करेगा। – ionelmc

4

मुझे लगता है कि gerdemb के जवाब पर TabularInline

var selector = "h2:contains('TITLE_OF_INLINE_BLOCK')"; 
$(selector).parent().addClass("collapsed"); 
$(selector).append(" (<a class=\"collapse-toggle\" id=\"customcollapser\" href=\"#\"> Show </a>)"); 
$("#customcollapser").click(function() { 
    $(selector).parent().toggleClass("collapsed"); 
}); 
2

में कुछ सुधार पर काम करता है इस समाधान jQuery का उपयोग कर के साथ आया था। उचित रूप से 'दिखाएँ' और 'छिपाएं' पाठ जोड़ता है, और आप पहले से एक सूची में सारणीबद्ध इनलाइन नाम निर्दिष्ट कर सकते हैं:

$(document).ready(function(){ 
var tabNames = ['Inline Name 1', 'Inline Name 2', 'Inline Name 3']; 
for (var x in tabNames) 
{ 
    var selector = "h2:contains(" + tabNames[x] + ")"; 
    $(selector).parent().addClass("collapsed"); 
    $(selector).append(" (<a class=\"collapse-toggle\" id=\"customcollapser\""+ x + " href=\"#\"> Show </a>)"); 
};  
$(".collapse-toggle").click(function(e) { 
    $(this).parent().parent().toggleClass("collapsed"); 
    var text = $(this).html(); 
    if (text==' Show ') { 
     $(this).html(' Hide '); 
     } 
    else { 
     $(this).html(' Show '); 
    }; 
    e.preventDefault(); 
}); 
}); 
3

आप grappelli उपयोग कर सकते हैं - जो fieldsets गिर समर्थन करता है। यह उपर्युक्त समाधानों की तरह एक समाधान का उपयोग करता है, लेकिन जावास्क्रिप्ट/कोडिंग पहले से ही किया जा चुका है - आपको बस अपने वर्गों में 'कक्षाएं' :(पतन बंद ',) जोड़ना होगा (http://readthedocs.org/docs/django-grappelli/en/latest/customization.html देखें)

उदाहरण के लिए:

class ModelOptions(admin.ModelAdmin): 
    fieldsets = (
     ('', { 
      'fields': ('title', 'subtitle', 'slug', 'pub_date', 'status',), 
     }), 
     ('Flags', { 
      'classes': ('grp-collapse grp-closed',), 
      'fields' : ('flag_front', 'flag_sticky', 'flag_allow_comments', 'flag_comments_closed',), 
     }), 
     ('Tags', { 
      'classes': ('grp-collapse grp-open',), 
      'fields' : ('tags',), 
     }), 
    ) 

class StackedItemInline(admin.StackedInline): 
    classes = ('grp-collapse grp-open',) 

class TabularItemInline(admin.TabularInline): 
    classes = ('grp-collapse grp-open',) 
2

मेरे वर्तमान समाधान, यहाँ सूचीबद्ध दूसरों के आधार पर, निम्नलिखित सुविधाएं होती हैं:

  • केवल गिर स्टैक किया inlines
  • inlines कि कोई त्रुटि हो पतन नहीं करता
  • 'खाली' इनलाइन को पतन नहीं करता है।

यह जावास्क्रिप्ट समाधान है, जिसका अर्थ यह है कि इसे किसी भी तरह से आपके पृष्ठ/टेम्पलेट में इंजेक्शन देने की आवश्यकता है।

इसे जरूरी होने पर पृष्ठ पर jQuery को लोड होने की आवश्यकता होती है। Django के आधुनिक संस्करणों में यह है।

$(function(){ 
    // Find all stacked inlines (they have an h3, with a span.inline_label). 
    // Add a link to toggle collapsed state. 
    $('.inline-group h3 .inline_label').append(' (<a class="collapse-toggle" href="#">Show</a>)'); 
    // Collapse all fieldsets that are in a stacked inline (not .tabular) 
    $('.inline-group :not(.tabular) fieldset').addClass('collapsed'); 
    // Click handler: toggle the related fieldset, and the content of our link. 
    $('.inline-group h3 .inline_label .collapse-toggle').on('click', function(evt) { 
    $(this).closest('.inline-related').find('fieldset').toggleClass('collapsed'); 
    text = $(this).html(); 
    if (text=='Show') { 
     $(this).html('Hide'); 
    } else { 
     $(this).html('Show'); 
    }; 
    evt.preventDefault(); 
    evt.stopPropagation(); 
    }); 
    // Un-collapse empty forms, otherwise it's 2 clicks to create a new one. 
    $('.empty-form .collapse-toggle').click(); 
    // Un-collapse any objects with errors. 
    $('.inline-group .errors').closest('.inline-related').find('.collapse-toggle').click(); 
}); 
3

django 1.10 से, अब हम अतिरिक्त सीएसएस कक्षाएं इनलाइनमोडेलएडमिन में भी जोड़ सकते हैं।

इनलाइनों के लिए प्रदान किए गए फ़ील्ड पर लागू करने के लिए अतिरिक्त सीएसएस कक्षाएं वाली एक सूची या टुपल। किसी के लिए डिफ़ॉल्ट नहीं है। फ़ील्ड्स में कॉन्फ़िगर किए गए वर्गों के साथ, एक पतन वर्ग के साथ इनलाइन शुरू में शुरू हो जाएगी और उनके शीर्षलेख में एक छोटा "शो" लिंक होगा।

Docs