2010-01-19 22 views
5

django व्यवस्थापक में मेरे पास एक इनलाइन वाला मॉडल है। मैं इनलाइन के लिए केवल "नई जोड़ें" लाइनों को दिखाने में सक्षम होना चाहता हूं, और इनलाइन से संबंधित तालिका में कोई भी पूर्ववर्ती, मूल डेटा नहीं दिखा सकता। क्या यह संभव है? मैंने max_num और अतिरिक्त के प्रत्येक संयोजन की कोशिश की है, और यह हमेशा मौजूदा तालिका डेटा दिखाता है।क्या मूल डेटा दिखाए बिना व्यवस्थापक इनलाइन होना संभव है?

धन्यवाद

उत्तर

2

मुझे लगता है कि इस InlineAdmin उपवर्ग में एक साधारण स्विच के साथ संभव नहीं है। लेकिन मैं के बारे में सोच सकते हैं एक छोटी सी "हैक" एक ही प्राप्त होता है कि:

अपने inlines रेंडर करने के लिए एक कस्टम टेम्पलेट निर्दिष्ट करने के लिए अपने InlineAdmin पर template विशेषता का उपयोग करें। अब उस मूल टेम्पलेट को कॉपी करें जिसे आप में अपने कस्टम टेम्पलेट में उपयोग करना चाहते हैं (उदा। django/contrib/admin/templates/admin/edit_inline/tabular.html कॉपी करें)। स्रोत देखें और {% for inline_admin_form in inline_admin_formset %} के साथ लाइन खोजें और इसके बाद {% if not inline_admin_form.original %} डालें। {% endfor %} टैग बंद होने से ठीक पहले {% endif %} भी डालें।

यह विधि वास्तव में इनलाइन के आउटपुट को छुपाती है। तो पृष्ठ पर कच्चे POST डेटा को पास करके उन्हें संशोधित करने के लिए अभी भी संभव है, उदाहरण के लिए curl (लेकिन "हमलावर" [पढ़ें: व्यवस्थापक उपयोगकर्ता ;-)] को django पता होना चाहिए और यह स्वरूपों में फ़ील्ड नाम उत्पन्न करता है) ।

tabular.html इस तरह अब लग सकती है:

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

मुझे लगता है कि अजगर कोड में यह करने के लिए क्लीनर तरीके, एक BaseInlineFormset उपवर्ग बनाकर होगा कि मौजूदा डेटा को कभी भी प्रदर्शित नहीं करता है और आपके व्यवस्थापक पर उचित विधि को ओवरराइड नहीं करता है। इसे अपने फॉर्मेट क्लास का उपयोग करने के लिए मॉडेलइनलाइन सबक्लास। –

+0

हां, मैं सहमत हूं। मैंने इसके बारे में सोचा नहीं है। शायद मुझे फॉर्मेट्स के साथ कम अनुभव करना है। सबक्लास दृष्टिकोण बहुत साफ है और इतना "हैक" नहीं है। –

1
from django.forms.models import inlineformset_factory 

और फिर

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) 
संबंधित मुद्दे