2009-05-26 18 views
88

व्यवस्थापक पर प्रविष्टियों को जोड़ने या संपादित करते समय Django क्षैतिज स्थान भरने लगता है, लेकिन, कुछ मामलों में, अंतरिक्ष का वास्तविक अपशिष्ट है, यानी, एक दिनांक फ़ील्ड को संपादित करना, 8 अक्षर चौड़ा, या एक चार फ़ील्ड, 6 या 8 वर्ण चौड़ा भी है, और फिर संपादन बॉक्स 15 या 20 वर्ण तक चला जाता है।Django प्रशासन में फ़ील्ड का आकार बदलें

मैं व्यवस्थापक को कैसे बता सकता हूं कि टेक्स्टबॉक्स कितना व्यापक होना चाहिए, या टेक्स्टफ़ील्ड संपादन बॉक्स की ऊंचाई?

+0

दिलचस्प जवाब का एक बहुत ... मैं जांच करेंगे जो कुछ भी तेजी से या मेरे ऐप्स पर बेहतर फिट बैठता है, और स्वीकार करते हैं कि: जाहिर है डी THX – Andor

+8

, आप ऐसा करना भूल गया इस मामले में। दो साल से अधिक बाद में। =) – casperOne

+0

परियोजना को हटा दिया गया और मुझे थोड़ी देर के लिए कोड नहीं मिला। मैं अगले महीने एक नई परियोजना शुरू कर सकता हूं, इसलिए शायद मैं इसे फिर से कर दूंगा: डी – Andor

उत्तर

161

आप ModelAdmin.formfield_overrides का उपयोग करना चाहिए में formfield_for_dbfield ओवरराइड।

यह काफी आसान है - admin.py में, निर्धारित करें:

class YourModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.CharField: {'widget': TextInput(attrs={'size':'20'})}, 
     models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})}, 
    } 

admin.site.register(YourModel, YourModelAdmin) 

मत भूलना कि आप उचित वर्गों आयात करना चाहिए - इस मामले में:

from django.forms import TextInput, Textarea 
from django.db import models 
+1

अगर मैं ऐसा कहता हूं तो यह एक बहुत अच्छा अच्छा समाधान है। – jathanism

+0

यह वही था जो मैं कुछ हास्यास्पद टेम्पलेट अनुकूलन किए बिना खोज रहा था। धन्यवाद! – Chris

+1

ध्यान दें कि यह आपके काम नहीं करेगा अगर 'filter_horizontal' या' filter_vertical' आपकेModelAdmin में संबंधित फ़ील्ड के लिए सेट है। मैंने इसे समझने में कुछ समय बिताया है। –

41

आप अपने "attrs" property का उपयोग कर विजेट पर मनमानी HTML विशेषताओं को सेट कर सकते हैं।

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_dbfield(self, db_field, **kwargs): 
    field = super(ContentAdmin, self).formfield_for_dbfield(db_field, **kwargs) 
    if db_field.name == 'somefield': 
     field.widget.attrs['class'] = 'someclass ' + field.widget.attrs.get('class', '') 
    return field 

या एक कस्टम विजेट उपवर्ग के साथ और formfield_overrides dictionary:

class DifferentlySizedTextarea(forms.Textarea): 
    def __init__(self, *args, **kwargs): 
    attrs = kwargs.setdefault('attrs', {}) 
    attrs.setdefault('cols', 80) 
    attrs.setdefault('rows', 5) 
    super(DifferentlySizedTextarea, self).__init__(*args, **kwargs) 

class MyModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { models.TextField: {'widget': DifferentlySizedTextarea}} 
21

एक त्वरित और गंदे विकल्प बस एक कस्टम प्रदान करना है

आप formfield_for_dbfield का उपयोग कर Django व्यवस्थापक में यह कर सकते हैं प्रश्न में मॉडल के लिए टेम्पलेट।

यदि आप admin/<app label>/<class name>/change_form.html नामक टेम्पलेट बनाते हैं तो व्यवस्थापक डिफ़ॉल्ट रूप से उस टेम्पलेट का उपयोग करेगा। यही है, अगर आपके पास Person नामक एक मॉडल है जिसे people नामक ऐप में मिला है, तो आप admin/people/person/change_form.html नामक टेम्पलेट बनायेंगे।

सभी व्यवस्थापक टेम्पलेट्स एक extrahead ब्लॉक आप <head> में सामान रखने के लिए ओवरराइड कर सकते हैं, और पहेली का अंतिम टुकड़ा तथ्य यह है कि हर क्षेत्र id_<field-name> की एक HTML आईडी है।

तो, आप अपने टेम्पलेट में निम्नलिखित की तरह कुछ डाल सकता है:

{% extends "admin/change_form.html" %} 

{% block extrahead %} 
    {{ block.super }} 
    <style type="text/css"> 
    #id_my_field { width: 100px; } 
    </style> 
{% endblock %} 
+0

फास्ट वर्कअराउंड (कस्टम चीजों से बचने के लिए)! मुझे यह पसंद है! – Andor

+0

धन्यवाद! यह और अलंजड्स द्वारा उत्तर प्रति फ़ील्ड-प्रकार के आधार पर, प्रति-फ़ील्ड आधार पर व्यवस्थापक इंटरफ़ेस में लेआउट को बदलने के लिए बहुत उपयोगी है। – nealmcb

10

आप प्रति-क्षेत्र उदाहरण पर गुण बदलना चाहते हैं, तो आप "attrs" संपत्ति सीधे करने के लिए जोड़ सकते हैं अपने फॉर्म प्रविष्टियां

उदाहरण के लिए

:

class BlogPostForm(forms.ModelForm): 
    title = forms.CharField(label='Title:', max_length=128) 
    body = forms.CharField(label='Post:', max_length=2000, 
     widget=forms.Textarea(attrs={'rows':'5', 'cols': '5'})) 

    class Meta: 
     model = BlogPost 
     fields = ('title', 'body') 

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

+0

एक और दिलचस्प दृष्टिकोण ... – Andor

+0

आईएमओ केवल एक ही फ़ील्ड को संशोधित करने का सबसे अच्छा तरीका है और सभी टेक्स्ट इनपुट-विजेट्स एक बार में नहीं (जैसे स्वीकृत उत्तर करता है) – ascripter

6

सबसे अच्छा तरीका मैंने पाया कुछ इस तरह है:

class NotificationForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(NotificationForm, self).__init__(*args, **kwargs) 
     self.fields['content'].widget.attrs['cols'] = 80 
     self.fields['content'].widget.attrs['rows'] = 15 
     self.fields['title'].widget.attrs['size'] = 50 
    class Meta: 
     model = Notification 

इसकी बहुत अलग विजेट के साथ क्षेत्रों अधिभावी, के रूप में यह name और help_text गुण और भी मॉडल क्षेत्रों के मूलभूत मूल्यों को बरकरार रखता है की तुलना में ModelForm के लिए बेहतर है, आप ऐसा उन्हें अपने फॉर्म में कॉपी करने की ज़रूरत नहीं है।

5

यह अच्छी तरह से Django FAQ में वर्णित है:

प्रश्न: मैं अपने मॉडल में एक मैदान पर एक विजेट के लिए विशेषताएं बदल सकता हूँ?

एक: ModelAdmin/StackedInline/TabularInline वर्ग

class MyOtherModelInline(admin.StackedInline): 
    model = MyOtherModel 
    extra = 1 

    def formfield_for_dbfield(self, db_field, **kwargs): 
     # This method will turn all TextFields into giant TextFields 
     if isinstance(db_field, models.TextField): 
      return forms.CharField(widget=forms.Textarea(attrs={'cols': 130, 'rows':30, 'class': 'docx'})) 
     return super(MyOtherModelInline, self).formfield_for_dbfield(db_field, **kwargs) 
+0

जब मैं इस तकनीक का उपयोग करता हूं तो सहायता टेक्स्ट प्रकट नहीं होगा, और यदि यह है एक टैब्यूलरइनलाइन, कॉलम हेडर 'कोई नहीं' बन जाता है। –

+1

यह एक अच्छा दृष्टिकोण नहीं है, क्योंकि आप चारफ़िल्ल्ड में अन्य सभी सेटिंग्स को मिटा रहे हैं। उदाहरण के लिए, डिफ़ॉल्ट रूप से, यह समझदारी से पता लगाएगा कि फ़ॉर्म फ़ील्ड की आवश्यकता होनी चाहिए या नहीं, लेकिन यह कोड उस को नष्ट कर देता है। आपको इसके बजाय अपने सुपर() कॉल द्वारा दिए गए मान पर विजेट सेट करना चाहिए। – Cerin

7

मैं के साथ एक समान समस्या थी पाठ का क्षेत्र। मैं Django 1.0.2 का उपयोग कर रहा हूं और संबंधित टेक्स्टरेरा में 'पंक्तियों' के लिए डिफ़ॉल्ट मान बदलना चाहता था। formfield_overrides इस संस्करण में मौजूद नहीं है। Formfield_for_dbfield को ओवरराइड करना लेकिन मुझे अपने प्रत्येक मॉडलएडमिन सबक्लास के लिए ऐसा करना पड़ा या इसके परिणामस्वरूप रिकर्सन त्रुटि हो गई। अंत में, मैंने पाया कि नीचे दिए गए कोड को जोड़ने का काम करता है models.py रहे हैं:

from django.forms import Textarea 

class MyTextField(models.TextField): 
#A more reasonably sized textarea                            
    def formfield(self, **kwargs): 
     kwargs.update(
      {"widget": Textarea(attrs={'rows':2, 'cols':80})} 
     ) 
     return super(MyTextField, self).formfield(**kwargs) 

फिर जब अपने मॉडल को परिभाषित करने TextField के बजाय MyTextField का उपयोग करें। मैंने इसे this answer से इसी तरह के प्रश्न में अनुकूलित किया।

+0

ब्रावो! यह सबसे आसान तरीका –

5

आप हमेशा अपने क्षेत्रों सेट कर सकते हैं एक कस्टम स्टाइलशीट में आकार और Django बता उपयोग करने के लिए है कि अपने ModelAdmin वर्ग के लिए:

class MyModelAdmin(ModelAdmin): 
    class Media: 
     css = {"all": ("my_stylesheet.css",)} 
+0

सबसे अच्छा जवाब है! फॉर्मफील्ड और विशेषताओं (और संभावित साइड इफेक्ट्स) के साथ कोई झुकाव नहीं, केवल एक सीएसएस फ़ाइल है, जो - django व्यवस्थापक रूपों में मौजूदा आईडी/कक्षाओं के साथ - आसानी से केवल कुछ, या यहां तक ​​कि सभी फ़ील्ड को लक्षित कर सकती है। प्रसिद्ध बनें! – benzkji

1

एक ही जवाब msdin के रूप में लेकिन TextArea के बजाय TextInput साथ:

from django.forms import TextInput 

class ShortTextField(models.TextField): 
    def formfield(self, **kwargs): 
     kwargs.update(
      {"widget": TextInput(attrs={'size': 10})} 
     ) 
     return super(ShortTextField, self).formfield(**kwargs) 
2

1.6 के लिए, फॉर्म का उपयोग करके मुझे charfield के अंदर textarea के गुण निर्दिष्ट करना था:

test1 = forms.CharField(max_length=400, widget=forms.Textarea(attrs={'rows':'2', 'cols': '10'}), initial='', help_text=helptexts.helptxt['test']) 
+0

यह 'टेक्स्टफ़िल्ल्ड' के लिए काम नहीं करता है। –

18

किसी विशिष्ट फ़ील्ड के लिए चौड़ाई बदलने के लिए।

ModelAdmin.get_form के माध्यम से बनाया गया:

class YourModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(YourModelAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['myfield'].widget.attrs['style'] = 'width: 45em;' 
     return form 
+0

मेरी राय में यह सबसे अच्छा जवाब है, क्योंकि यह एक नया फॉर्म बनाने के बिना व्यक्तिगत फ़ील्ड बदलने की अनुमति देता है। – rbennell

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