2013-08-22 7 views
18

निम्नलिखित मॉडलएडमिन पर विचार करें। इस उदाहरण में, मैं "कोई नहीं" फ़ील्डसेट और नोट्स फ़ील्ड के बीच इनलाइन "बुक" यूआई डिस्प्ले रखना चाहता हूं। क्या यह संभव है?मैं एक फ़ील्डसेट में Django व्यवस्थापक इनलाइन मॉडल कैसे प्रदर्शित कर सकता हूं?

class AuthorAdmin(admin.ModelAdmin): 
    inlines = [BookInline] 

    fieldsets = (
      (None, { 
       'fields': ('author_name', 'date_of_birth') 
      }), 
      ('Notes', { 
       'fields': (['notes']) 
      }), 
    ) 

उत्तर

6

दुर्भाग्य से यह (मानक टेम्पलेट से) django के साथ संभव नहीं है। आप change_form के लिए टेम्पलेट को देखें, तो आप देख सकते हैं कि inlines हमेशा fieldset के बाद अलग से प्रदान की गई कर रहे हैं: https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/change_form.html

केवल काम के आसपास मैं देख रहा हूँ आप चाहते हैं क्रम के संबंध में एक कस्टम टेम्पलेट लिखने के लिए है।

+3

एक और कामकाज जो कुछ संबंधों में क्लीनर है - और दूसरों में गंदगी - इनलाइनों को स्थानांतरित करने के लिए jQuery का उपयोग करना होगा। –

+1

@andybak वर्तमान सीमा को देखते हुए, jquery का उपयोग एक साफ कामकाज होगा। – elsadek

+0

यदि आप मूल फ़ील्ड सेट का हिस्सा नहीं हैं, तो आप इनलाइन के लिए फ़ील्ड भी बना सकते हैं। वैसे भी जो मैं वैसे भी था। – radtek

9

बर्ट्रेंड Bortage यहाँ एक और समाधान तैनात: कहने के लिए https://groups.google.com/forum/#!topic/django-users/yUq2Nvx_4eM

देर जबाब कि मैं सिर्फ अपनी परियोजनाओं में से एक में इस समस्या के लिए एक काफी साफ समाधान धक्का दिया: https://github.com/dezede/dezede/commit/ed13ccaf34494e71fd913fd785c229052f6acdc8

विचार आपके ModelAdmin (s), 'एफ' और 'i' वर्ण ("fieldset" के लिए और "इनलाइन") के एक iterable है कि पहली fieldsets और के बीच क्रम निर्दिष्ट fieldsets_and_inlines_order परिभाषित करने के लिए है रेखा के अंदर। यदि लेन (fieldsets_and_inlines_order) < लेन (फ़ील्ड) + लेन (इनलाइन), शेष मूल व्यवहार (फ़ील्ड पहले, फिर सभी इनलाइन) का पालन करता है।

उदाहरण: यदि आप 5 fieldsets और 3 inlines, परिभाषित करने fieldsets_and_inlines_order = है ('एफ', 'एफ', 'i', 'च', 'मैं') आप दे देंगे: fieldset fieldset इनलाइन fieldset इनलाइन fieldset फ़ील्ड्स इनलाइन आशा यह मदद करता है, बर्ट्रेंड

मेरे पास एक और विचार था जो विचार करने योग्य है। प्रत्येक इनलाइन के लिए अपने फ़ील्ड में एक पठनीय प्लेसहोल्डर फ़ील्ड बनाएं, फिर प्रत्येक प्लेसहोल्डर के लिए इनलाइनों को स्थानांतरित करने के लिए jQuery का उपयोग करें। कुछ इस तरह (jQuery लोप के रूप में मैं इसे अभी तक नहीं लिखा है): -: https://code.djangoproject.com/ticket/4848

0

मैं एक काफी का निर्माण किया है

fieldsets = (
     (None, { 
      'fields': (
       ('inline_images',) 
       ('thumbnail_image',), 
       ('inline_authors',) 
       ('title', 'is_active', 'order',) 
      ), 
     }), 
    ) 

readonly_fields = ('inline_images', 'inline_authors') 

inline_images = '<span id='replaceme inline_images'></span>' 
inline_images.allow_tags = True 
inline_authors = '<span id='replaceme inline_authors'></span>' 
inline_authors.allow_tags = True 

एक और बात वहाँ inlines के इस स्थिति के लिए पूछ एक खुला Django मुद्दा है सामान्य समाधान ...

अपने admin.py में अपने इनलाइन करने के लिए एक नए क्षेत्र जोड़ें:

class YourModelInline(admin.TabularInline): 
    model = YourModel 
    after_field = "fieldname_of_field_before_inline" 

फिर AdminClas की render_change_form अनुकूलित मॉडल के रों कि इनलाइन रखती है:

class EditModelAdmin(model.ModelAdmin): 
    inlines = [YourModelInline,] 

    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): 
     sorted_inline_formsets = {} 
     inline_admin_formsets = context['inline_admin_formsets'] 
     formsets_to_remove = [] 

     for inline_formset in inline_admin_formsets: 
      if hasattr(inline_formset.opts, 'after_field'): 
       fieldname = inline_formset.opts.after_field 
       if fieldname in sorted_inline_formsets: 
        sorted_inline_formsets[fieldname].append(inline_formset) 
       else: 
        sorted_inline_formsets.update({ 
         fieldname: [inline_formset,] 
        }) 
       formsets_to_remove.append(inline_formset) 
     for inline_formset in formsets_to_remove: 
      inline_admin_formsets.remove(inline_formset) 

     context.update({ 
      'sorted_inline_formsets': sorted_inline_formsets, 
      'inline_admin_formsets': inline_admin_formsets 
     }) 
     return super(EditModelAdmin, self).render_change_form(request, context, add=add, 
                 change=change, obj=obj, form_url=form_url) 

हम कुंजी के रूप में FIELDNAME साथ खुद शब्दकोश में अतिरिक्त क्षेत्र के साथ सभी inlines आगे बढ़ रहे हैं ... इसे सही ढंग से प्रदान करने की लिए बनाने फ़ाइल/टेम्पलेट्स/व्यवस्थापक/शामिल/fieldet.html जो मानक django फ़ील्डसेट को ओवरराइड करता है।निम्नलिखित सामग्री के साथ एचटीएमएल:

{% load custom_filter %} 
 
<fieldset class="module aligned {{ fieldset.classes }}"> 
 
     {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %} 
 
     {% if fieldset.description %} 
 
      <div class="description">{{ fieldset.description|safe }}</div> 
 
     {% endif %} 
 
     {% for line in fieldset %} 
 
      <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}"> 
 
       {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} 
 
       {% for field in line %} 
 
        <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}> 
 
         {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} 
 
         {% if field.is_checkbox %} 
 
          {{ field.field }}{{ field.label_tag }} 
 
         {% else %} 
 
          {{ field.label_tag }} 
 
          {% if field.is_readonly %} 
 
           <div class="readonly">{{ field.contents }}</div> 
 
          {% else %} 
 
           {{ field.field }} 
 
          {% endif %} 
 
         {% endif %} 
 
         {% if field.field.help_text %} 
 
          <div class="help">{{ field.field.help_text|safe }}</div> 
 
         {% endif %} 
 
        </div> 
 
        {% if field.field.name %} 
 
         {% with field.field.name as fieldname %} 
 
          {% if sorted_inline_formsets|get_dict_value:fieldname != False %} 
 
           {% for inline_admin_formset in sorted_inline_formsets|get_dict_value:fieldname %} 
 
            {% include inline_admin_formset.opts.template %} 
 
           {% endfor %} 
 
          {% endif %} 
 
         {% endwith %} 
 
        {% endif %} 
 
       {% endfor %} 
 
      </div> 
 
     {% endfor %} 
 
    </fieldset>

यह संगत फ़ील्ड के बाद क्रमबद्ध inlines जोड़ देगा ... अब आप केवल Django टेम्पलेट में शब्दकोश के साथ काम करने के लिए custom_filter की जरूरत है, templatetags/custom_filter पैदा करते हैं। py और जोड़ें:

@register.filter 
def get_dict_value(dict, key): 
    if key in dict: 
     return dict[key] 
    else: 
     return False 

और देखा: आप उस क्षेत्र के बाद इसे जोड़ने के लिए किसी भी इनलाइन में किसी भी FIELDNAME दर्ज कर सकते हैं ... यह सेटअप करने के लिए एक सा काम है लेकिन सॉर्ट करने के लिए अगर आपके पास कई inlines है यह हो सकता है एक क्लीनर तरीका ...

संबंधित मुद्दे