2009-02-09 10 views
6

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

admin.py

from django.contrib import admin 
import models 
from django.forms.models import BaseInlineFormSet 
from django import forms 
from forms import ProgressForm 
from django.template.defaultfilters import slugify 

class ProgressInlineFormset(BaseInlineFormSet): 
    def add_fields(self, form, index): 
     print "ding" 
     super(ProgressInlineFormset, self).add_fields(form, index) 
     for criterion in models.Criterion.objects.all(): 
      form.fields[slugify(criterion.name)] = forms.IntegerField(label=criterion.name) 

class ProgressInline(admin.TabularInline): 
    model = models.Progress 
    extra = 8 
    formset = ProgressInlineFormset 

class ReportAdmin(admin.ModelAdmin): 
    list_display = ("name", "pdf_column",) 
    search_fields = ["name",] 
    inlines = (ProgressInline,) 

admin.site.register(models.Report, ReportAdmin) 

उत्तर

1
model = models.Progress 

व्यवस्थापक में वहाँ केवल इस प्रगति मॉडल में निर्धारित की गई फ़ील्ड हो जाएगा। आपके पास कोई फ़ील्ड/फ़ील्ड्स विकल्प ओवरराइटिंग नहीं है।

आप नए लोगों को जोड़ने के लिए चाहते हैं, तो दो विकल्प हैं:

  • मॉडल परिभाषा में, उन नए अतिरिक्त (! उन्हें वैकल्पिक बनाने)
  • व्यवस्थापक मॉडल में फ़ील्ड्स जोड़ने (admin.TabularInline), कुछ कुछ जोड़ने की तरह:

    क्षेत्रों = ('newfield1', 'newfield2', 'newfield3')

fields, fieldsets पर एक नज़र डालें।

+0

मैं नहीं क्या सुनना की उम्मीद कर रहा था, लेकिन ओह अच्छी तरह से। कम से कम इसकी पुष्टि की। – Soviut

4

मैं इसे दूसरे तरीके से किया था:

forms.py:

from django import forms 
class ItemAddForm(forms.ModelForm): 
    my_new_field = forms.IntegerField(initial=1, label='quantity') 
    class Meta: 
     model = Item 

admin.py:

from django.contrib import admin 
from forms import * 
class ItemAddInline(admin.TabularInline): 
    form = ItemAddForm 

यह अब तक काम करता है, मैं केवल विधि बचाने के किसी भी तरह ओवरराइड करने के लिए की जरूरत है इस नए क्षेत्र को संभालने के लिए। इसे देखें: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form। यह कहता है कि डिफ़ॉल्ट रूप से इनलाइनों का उपयोग बेसमोडेलफॉर्म का उपयोग करता है, जो formet_factory को भेजता है। यह मेरे लिए काम नहीं करता है, त्रुटियों के साथ बेसमोडेलफॉर्म को उपclass करने की कोशिश की (कोई विशेषता '_meta')। तो मैं इसके बजाय मॉडलफॉर्म का उपयोग करता हूं।

+0

इस उत्तर के लिए धन्यवाद। क्या आपके पास इनलाइन फॉर्मेट के लिए सहेजने के लिए ओवरराइड करने के बारे में कोई और जानकारी है? –

+0

नहीं, इस पर वर्षों से काम नहीं किया है ... – alekwisnia

+2

उल्लेख करना चाहते हैं, कि 'लेबल =' भाग बहुत महत्वपूर्ण है। इसके बिना त्रुटि है 'विशेषता त्रुटि:' my_new_field'' – TitanFighter

2

आप किसी अन्य माध्यम से यह कर सकते हैं (गतिशील रूपों):

admin.py

class ProgressInline(admin.TabularInline): 
    model = models.Progress 
    extra = 8 

    def get_formset(self, request, obj=None, **kwargs): 
     extra_fields = {'my_field': forms.CharField()} 
     kwargs['form'] = type('ProgressForm', (forms.ModelForm,), extra_fields) 
     return super(ProgressInline, self).get_formset(request, obj, **kwargs) 
+0

देखने में असमर्थ अच्छा उदाहरण है, लेकिन 1.10.2 में काम नहीं करता है। @ एलेक्विस्निया के उदाहरण से मैंने पाया कि बिना 'लेबल = 'new_field काम नहीं करता है। आपके उदाहरण में 'लेबल' कैसे जोड़ें? धन्यवाद। – TitanFighter

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