জ্যাঙ্গো অ্যাডমিনে ক্ষেত্রগুলির পুনরায় আকার দিন


107

জ্যাঙ্গো অ্যাডমিনে এন্ট্রি যোগ বা সম্পাদনা করার সময় অনুভূমিক স্থান পূরণ করার ঝোঁক রাখে, তবে কিছু ক্ষেত্রে, একটি সত্যিকারের জায়গার অপচয় হয়, যখন, কোনও তারিখের ক্ষেত্রটি সম্পাদনা করা হয়, 8 টি অক্ষর প্রশস্ত, বা একটি চারফিল্ডও 6 বা 8 চরগুলি প্রশস্ত করুন এবং তারপরে সম্পাদনা বাক্সটি 15 বা 20 টি অক্ষরে যায়।

পাঠ্যবক্সটি কত প্রশস্ত হওয়া উচিত, বা পাঠ্যফিল্ড সম্পাদনা বাক্সটির উচ্চতা কীভাবে আমি প্রশাসককে বলতে পারি?


9
স্পষ্টতই, আপনি এই ক্ষেত্রে এটি করতে ভুলে গেছেন। আরও দুই বছর পরে। =)
ক্যাস্পার এক

প্রকল্পটি খালি হয়ে গেছে এবং আমি কিছুক্ষণের জন্য কোড দেখতে পেলাম না। আমি পরের মাসে একটি নতুন প্রকল্প শুরু করতে পারি, তাই সম্ভবত আমি এটি আবার দেখতে পাব: ডি
আন্দোর

উত্তর:


209

আপনার মডেলএডমিন.ফর্মফিল্ড_ওভারাইডগুলি ব্যবহার করা উচিত ।

এটি বেশ সহজ - admin.pyসংজ্ঞায়িত:

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

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)

1
কিছু হাস্যকর টেম্পলেট কাস্টমাইজেশন না করে আমি ঠিক এটিই খুঁজছিলাম। ধন্যবাদ!
ক্রিস

2
মনে রাখবেন যে আপনার কাজটি আপনার মডেলএডমিনে সংশ্লিষ্ট ক্ষেত্রগুলির জন্য সেট করা থাকলে filter_horizontalবা filter_verticalএটি সেট করে না। আমি এটি বের করার জন্য কিছু সময় ব্যয় করেছি।
ডেনিস গোলোমাজভ

কোন ফর্মের মধ্যে এই নিয়ে কোন বিড়বিড়তা আছে? আমি সমস্ত টেক্সারিয়াসের জন্য অ্যাট্রিবিউটস অ্যাট্রিবিউট সেট করার কোনও উপায় খুঁজে পাইনি।
জুলিয়ান

1
আমি কেবল ব্যবহার করেছি models.TextField: {'widget': Textarea(attrs={'rows':4})}তবে প্রস্থটিও ছোট হয়ে গেছে।
স্মিথ জন্থ

দৃশ্যত তাদের আকার একই আকারে পাওয়া শক্ত।
সেরেন

44

আপনি উইজেটের "অ্যাটর্স" সম্পত্তিটি ব্যবহার করে নির্বিচারে এইচটিএমএল বৈশিষ্ট্যগুলি সেট করতে পারেন ।

আপনি জ্যাঙ্গো অ্যাডমিনে formfield_for_dbfield ব্যবহার করে এটি করতে পারেন:

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

অথবা একটি কাস্টম উইজেট সাবক্লাস এবং ফর্মফিল্ড_ওভারাইডসমূহ অভিধান সহ :

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}}

29

নির্দিষ্ট ক্ষেত্রের প্রস্থ পরিবর্তন করতে।

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

আমার মতে এটি সেরা উত্তর, যেহেতু এটি কোনও নতুন ফর্ম তৈরি না করেই পৃথক ক্ষেত্রগুলি পরিবর্তনের অনুমতি দেয়।
rbennell

20

একটি দ্রুত এবং নোংরা বিকল্পটি হল প্রশ্নে থাকা মডেলের জন্য কেবল একটি কাস্টম টেম্পলেট সরবরাহ করা।

যদি আপনি নামের কোনও টেম্পলেট তৈরি করেন admin/<app label>/<class name>/change_form.htmlতবে প্রশাসক ডিফল্ট পরিবর্তে সেই টেম্পলেটটি ব্যবহার করবেন। এটি হল, যদি আপনি নামের Personএকটি অ্যাপ্লিকেশনটিতে একটি মডেল পেয়ে থাকেন তবে আপনি peopleএকটি টেমপ্লেট তৈরি করবেনadmin/people/person/change_form.html

সমস্ত অ্যাডমিন টেমপ্লেটগুলির একটি extraheadব্লক রয়েছে যাতে আপনি স্টাফ রাখার জন্য ওভাররাইড করতে পারেন <head>এবং ধাঁধাটির চূড়ান্ত টুকরোটি হ'ল প্রতিটি ক্ষেত্রের এইচটিএমএল আইডি রয়েছে id_<field-name>

সুতরাং, আপনি আপনার টেমপ্লেটে নিম্নলিখিতগুলির মতো কিছু রাখতে পারেন:

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

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

ধন্যবাদ! এটি এবং এলানজ্ডসের উত্তরটি প্রতি-ক্ষেত্রের ভিত্তিতে নয়, প্রতি-ক্ষেত্রের ভিত্তিতে অ্যাডমিন ইন্টারফেসের বিন্যাস পরিবর্তন করার জন্য খুব সহায়ক।
নীলামকবি

10

আপনি যদি প্রতি ক্ষেত্রের উদাহরণগুলিতে বৈশিষ্ট্যগুলি পরিবর্তন করতে চান তবে আপনি সরাসরি আপনার ফর্ম এন্ট্রিগুলিতে "অ্যাটর্স" সম্পত্তি যুক্ত করতে পারেন।

উদাহরণ স্বরূপ:

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')

"অ্যাটর্স" সম্পত্তিটি মূলত এইচটিএমএল মার্কআপের সাথে পাস করে যা ফর্ম ক্ষেত্রটি সামঞ্জস্য করবে। প্রতিটি এন্ট্রি হ'ল বৈশিষ্ট্যটির একটি দ্বিধা যা আপনি ওভাররাইড করতে চান এবং যে মানটি দিয়ে আপনি এটি ওভাররাইড করতে চান তা। যতক্ষণ আপনি কমা দিয়ে প্রতিটি টিপলকে পৃথক করেন ততক্ষণ আপনি নিজের পছন্দ মতো অনেকগুলি বৈশিষ্ট্য প্রবেশ করতে পারেন।


আইএমও কেবলমাত্র একটি একক ক্ষেত্র এবং সমস্ত পাঠ্য ইনপুট-উইজেট একসাথে নয় (যেমন স্বীকৃত উত্তর দেয়) পরিবর্তিত করার সর্বোত্তম উপায়
অ্যাসক্রিপ্টর

7

আমি সবচেয়ে ভাল উপায়টি খুঁজে পেয়েছি এরকম কিছু:

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বৈশিষ্ট্যগুলি এবং মডেল ক্ষেত্রগুলির ডিফল্ট মানগুলিও সংরক্ষণ করে, তাই আপনাকে সেগুলি আপনার ফর্মটিতে অনুলিপি করতে হবে না।


7

টেক্সটফিল্ডে আমারও একই সমস্যা ছিল। আমি জ্যাঙ্গো ০.০.২ ব্যবহার করছি এবং সংশ্লিষ্ট পাঠের ক্ষেত্রে 'সারিগুলির' জন্য ডিফল্ট মান পরিবর্তন করতে চেয়েছি। এই সংস্করণে ফর্মফিল্ড_ওভারাইডগুলি বিদ্যমান নেই। ওভাররাইডিং ফর্মফিল্ড_ফোর্ড_ডিবিফিল্ড কাজ করেছে তবে আমার প্রতিটি মডেলএডমিন সাবক্লাসের জন্য আমাকে এটি করতে হয়েছিল অথবা এর ফলে পুনরাবৃত্তি ত্রুটি হতে পারে। অবশেষে, আমি দেখতে পেলাম যে মডেলগুলির সাথে নীচে কোড যুক্ত করে pypy কাজ করে:

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)

তারপরে আপনার মডেলগুলি সংজ্ঞায়িত করার সময় পাঠ্যফিল্ডের পরিবর্তে মাই টেক্সটফিল্ড ব্যবহার করুন। আমি এই উত্তর থেকে এটি একটি অনুরূপ প্রশ্নের সাথে অভিযোজিত করেছি ।


5

এটি জ্যাঙ্গো এফএকিউতে ভালভাবে বর্ণনা করা হয়েছে :

প্রশ্ন: আমি কীভাবে আমার মডেলের কোনও ক্ষেত্রে উইজেটের বৈশিষ্ট্যগুলি পরিবর্তন করব?

উত্তর: মডেলএডমিন / স্ট্যাকডইনলাইন / ট্যাবুলারআইনলাইন ক্লাসে ফর্মফিল্ড_ফোর্ড_ডিবিফিল্ডকে ওভাররাইড করুন

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)

আমি যখন এই কৌশলটি ব্যবহার করি তখন সহায়তা পাঠ্যটি উপস্থিত হয় না এবং এটি যদি একটি ট্যাবুলারইনলাইন হয় তবে কলামের শিরোনামটি 'কিছুই নয়' হয়ে যায়।
স্টিভেন টি। স্নাইডার

1
আপনি চারফিল্ডের অন্যান্য সমস্ত সেটিংস মুছে ফেলছেন বলে এটি কোনও ভাল পদ্ধতির নয়। উদাহরণস্বরূপ, ডিফল্টরূপে, এটি ফর্ম ক্ষেত্রের প্রয়োজন হবে কিনা তা বুদ্ধিমানের সাথে সনাক্ত করতে পারে তবে এই কোডটি এটি ধ্বংস করে। পরিবর্তে আপনার সুপার () কল দ্বারা ফিরে আসা মানটি অনুসারে আপনার উইজেটটি সেট করা উচিত।
সেরিন

5

আপনি সর্বদা আপনার ক্ষেত্রগুলির মাপকে কাস্টম স্টাইলশিটে সেট করতে পারেন এবং জ্যাঙ্গোকে এটি আপনার মডেলএডমিন শ্রেণীর জন্য ব্যবহার করতে বলতে পারেন:

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

সর্বোত্তম উত্তর! ফর্মফিল্ড এবং বৈশিষ্ট্যগুলি (এবং সম্ভাব্য পার্শ্ব প্রতিক্রিয়া) দিয়ে কোনও ঝাঁকুনি নেই, কেবল একটি সিএসএস ফাইল, যা - জাঙ্গো অ্যাডমিন ফর্মগুলিতে বিদ্যমান আইডি / ক্লাস সহ - সহজেই কেবল কয়েকটি বা সমস্ত ক্ষেত্রকে লক্ষ্য করে। বড়!
বেনজকিজি

2

1.6 এর জন্য, ফর্মগুলি ব্যবহার করে আমাকে চারফিল্ডের ভিতরে টেক্সারিয়ার বৈশিষ্ট্যগুলি নির্দিষ্ট করতে হয়েছিল:

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

1

এমএসডিন হিসাবে একই পাঠ্য লেখার পরিবর্তে পাঠ্য ইনপুট সহ:

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)

1

এখানে একটি সহজ, তবু নমনীয় সমাধান। কিছু উইজেট ওভাররাইড করতে একটি কাস্টম ফর্ম ব্যবহার করুন।

# models.py
class Elephant(models.Model):
    name = models.CharField(max_length=25)
    age = models.IntegerField()

# forms.py
class ElephantForm(forms.ModelForm):

    class Meta:
        widgets = {
            'age': forms.TextInput(attrs={'size': 3}),
        }

# admin.py
@admin.register(Elephant)
class ElephantAdmin(admin.ModelAdmin):
    form = ElephantForm

উইজেটগুলি দেওয়া হয়েছে ElephantForm প্রতিস্থাপন করবে। কীটি হল ক্ষেত্রের স্ট্রিং প্রতিনিধিত্ব। ফর্মটিতে উল্লিখিত ক্ষেত্রগুলি ডিফল্ট উইজেট ব্যবহার করবে।

মনে রাখবেন যে যদিও ageআমরা একটি উইজেট IntegerFieldব্যবহার করতে পারি TextInput, কারণ এর বিপরীতে NumberInput, গুণটি TextInputগ্রহণ করে size

এই সমাধানটি এই নিবন্ধে বর্ণিত হয়েছে


0

আপনি যদি কোনও বিদেশী ক্ষেত্রের সাথে কাজ করছেন যা পছন্দ / অপশন / একটি ড্রপডাউন মেনুতে জড়িত থাকে তবে আপনি formfield_for_foreignkeyঅ্যাডমিন উদাহরণটিতে ওভাররাইড করতে পারেন :

class YourNewAdmin(admin.ModelAdmin):
    ...

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'your_fk_field':
            """ For your FK field of choice, override the dropdown style """
            kwargs["widget"] = django.forms.widgets.Select(attrs={
                'style': 'width: 250px;'
            })

        return super().formfield_for_foreignkey(db_field, request, **kwargs)

এখানে এবং এখানে এই প্যাটার্ন সম্পর্কে আরও তথ্য ।


-1

এবং আরও একটি উদাহরণ:

class SecenekInline(admin.TabularInline):
   model = Secenek
   # classes = ['collapse']
   def formfield_for_dbfield(self, db_field, **kwargs):
       field = super(SecenekInline, self).formfield_for_dbfield(db_field, **kwargs)
       if db_field.name == 'harf':
           field.widget = TextInput(attrs={'size':2})
       return field
   formfield_overrides = {
       models.TextField: {'widget': Textarea(attrs={'rows':2})},
   }
   extra = 2

আপনি যদি কেবল একটি নির্দিষ্ট ক্ষেত্রের আকার সম্পাদনা করতে চান তবে আপনি এটি ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.