2012-04-03 11 views
11

फॉर्म प्रदर्शित होने से पहले, Django मॉडल उदाहरण जोड़ने के लिए स्वचालित रूप से जेनरेट किए गए फ़ॉर्म में किसी फ़ील्ड का प्रारंभिक मान कैसे सेट कर सकता हूं? मैं Django 1.3.1 का उपयोग कर रहा हूँ।Django व्यवस्थापक मॉडल के लिए प्रारंभिक डेटा कैसे सेट करें उदाहरण उदाहरण जोड़ें?

मेरे मॉडल निम्नलिखित है: विशेष

class Foo(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField() 

और वर्तमान व्यवस्थापक प्रपत्र है वास्तव में कुछ भी नहीं एक

class FooAdmin(admin.ModelAdmin): 
    ordering = ('title',) 

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

वहाँ हो रही है पर मेरे वर्तमान सबसे अच्छा प्रयास यह है:

def get_default_content(): 
    return 'this is a template for a Foo description' 

class FooAdminForm(django.forms.ModelForm): 

    class Meta: 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     kwargs['initial'].update({'description': get_default_content()}) 
     super(FooAdminForm, self).__init__(self, *args, **kwargs) 

class FooAdmin(admin.ModelAdmin): 
    ordering = ('title',) 
    form = FooAdminForm 

लेकिन अगर मैं यह कोशिश मैं इस Django त्रुटि मिलती है:

AttributeError at /admin/bar/foo/add/ 
    'FooForm' object has no attribute 'get' 
Request Method: GET 
Request URL: http://localhost:8000/admin/bar/foo/add/ 
Django Version: 1.3.1 
Exception Type: AttributeError 
Exception Value: 'FooForm' object has no attribute 'get' 
Exception Location: /www/django-site/venv/lib/python2.6/site-packages/django/forms/widgets.py in value_from_datadict, line 178 

मैं, यहाँ क्या गलत है पता नहीं है और इसे काम करने के लिए मुझे क्या करना चाहिए। मुझे इस त्रुटि के बारे में अजीब लगता है (इस तथ्य के अलावा कि मैं इसे बिल्कुल देखता हूं) यह है कि मेरे कोड में कोई फूफॉर्म नहीं है?

उत्तर

17

आपको self को अपनी __init__ विधि परिभाषा में पहले तर्क के रूप में शामिल करने की आवश्यकता है, लेकिन जब आप सुपरक्लास 'विधि को कॉल करते हैं तो इसे शामिल नहीं करना चाहिए।

def __init__(self, *args, **kwargs): 
    # We can't assume that kwargs['initial'] exists! 
    if not kwargs.get('initial'): 
     kwargs['initial'] = {} 
    kwargs['initial'].update({'description': get_default_content()}) 
    super(FooAdminForm, self).__init__(*args, **kwargs) 

कहा करने के बाद कि, एक मॉडल क्षेत्र ताकि आप सब पर एक कस्टम व्यवस्थापक प्रपत्र परिभाषित करने के लिए नहीं हो सकता है अपने default के लिए एक प्रतिदेय ले जा सकते हैं,।

class Foo(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField(default=get_default_content) 
+0

वाह, यह एक आकर्षण की तरह काम किया! इस तरह की मूर्खतापूर्ण गलती के रास्ते से बेहद गुप्त संदेश ... आपकी मदद के लिए बहुत बहुत धन्यवाद! –

+0

वैसे, मैंने आपके दूसरे सुझाव को सफलतापूर्वक भी आजमाया, जो कि क्लीनर भी है, इसलिए फिर से धन्यवाद! –

+0

मैंने पाया कि सेटिंग कोवर्ग ['प्रारंभिक'] फ़ॉर्म को सहेजते समय त्रुटि हुई। मैं एक अगर खंड स्थापित किया था: अगर kwargs.keys() में 'प्रारंभिक':।। kwargs [ 'प्रारंभिक'] अद्यतन (... यह प्रारंभिक मान प्रदर्शित करने और उन्हें अद्यतन करने के लिए काम किया – Sven

7

अधिक तो 3 साल बाद, लेकिन असल में आपको क्या करना चाहिए ओवरराइड admin.ModelAdmin formfield_for_dbfield .. इस तरह है:

class FooAdmin(admin.ModelAdmin): 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     field = super(FooAdmin, self).formfield_for_dbfield(db_field, **kwargs) 
     if db_field.name == 'description': 
      field.initial = 'My initial description' 
     elif db_field.name == 'counter': 
      field.initial = get_counter() + 1 
     return field 

चीयर्स;

+0

बहुत अच्छा है। यह अजीब बात है लेकिन दस्तावेज़ में ऐसी कोई चीज़ नहीं है: https: // docs। djangoproject.com/en/1।8/रेफरी/contrib/admin/ – Wtower

+0

दुर्भाग्य से, Django व्यवस्थापक अंडर-डॉक्यूमेंटेड "रास्ता" है। –

15

अलास्डेयर का दृष्टिकोण अच्छा है लेकिन पुराना है। रादेव का दृष्टिकोण काफी अच्छा दिखता है और जैसा कि टिप्पणी में उल्लिखित है, यह मुझे मारता है कि दस्तावेज़ीकरण में इसके बारे में कुछ भी नहीं है।

उन लोगों से

अलावा, Django 1.7 के बाद से ModelAdmin में एक समारोह get_changeform_initial_data है वहाँ सेट है कि प्रारंभिक रूप मान:

def get_changeform_initial_data(self, request): 
    return {'name': 'custom_initial_value'} 
+0

किसी कारण से 1.10.2 में इस विधि को बिल्कुल नहीं कहा जाता है, हालांकि यह दस्तावेज़ – scythargon

+0

@Scythargon में मौजूद है, मैंने अभी इसे 1.10.2 में परीक्षण किया है और मेरे लिए यह दस्तावेज के रूप में काम करता है। – Wtower

+0

ModelAdmin के लिए सभी उपलब्ध हुकों का ट्रैक खोना आसान है। इसके लिए धन्यवाद! –

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