জ্যাঙ্গো-অ্যাডমিন: টেক্সটরিয়া হিসাবে চারফিল্ড


88

আমার আছে

class Cab(models.Model):
    name  = models.CharField( max_length=20 )
    descr = models.CharField( max_length=2000 )

class Cab_Admin(admin.ModelAdmin):
    ordering     = ('name',)
    list_display = ('name','descr', )
    # what to write here to make descr using TextArea?

admin.site.register( Cab, Cab_Admin )

অ্যাডমিন ইন্টারফেসে টেক্সারএরিয়া উইজেটকে 'descr' ফিল্ডে কীভাবে অর্পণ করবেন?

upd:
ইন এডমিন ইন্টারফেসের শুধুমাত্র!

মডেলফর্ম ব্যবহার করার জন্য ভাল ধারণা।


4
গৃহীত উত্তরটি হ'ল মাত্র একটি ক্ষেত্রকে সংশোধন করার উদ্দেশ্যে বিশাল ওভারকিল! মানুষ সরলতা উদ্দেশ্যে কার্ল মেয়ার দ্বারা এই উত্তর অনুসরণ stackoverflow.com/questions/430592/...
andilabs

উত্তর:


99

আপনাকে এমন একটি তৈরি forms.ModelFormকরতে হবে যা আপনাকে descrক্ষেত্রটি কীভাবে প্রদর্শিত হতে চায় তা বর্ণনা করবে এবং তারপরে admin.ModelAdminসেই ফর্মটি ব্যবহার করতে বলবে । উদাহরণ স্বরূপ:

from django import forms
class CabModelForm( forms.ModelForm ):
    descr = forms.CharField( widget=forms.Textarea )
    class Meta:
        model = Cab

class Cab_Admin( admin.ModelAdmin ):
    form = CabModelForm

এর formবৈশিষ্ট্যটি admin.ModelAdminঅফিসিয়াল জ্যাঙ্গো ডকুমেন্টেশনে নথিভুক্ত করা হয়েছে। এখানে দেখার জন্য একটি জায়গা


6
কেবলমাত্র একটি ফর্ম উইজেট প্রতিস্থাপনের জন্য আপনাকে নিজের সম্পূর্ণ ফর্ম তৈরি করতে হবে না। আপনি কেবল formfield_for_dbfieldআপনার উপর ওভাররাইড করতে পারেন ModelAdmin, নীচে আমার উত্তর দেখুন।
কার্ল মেয়ার

4
এটি দেয়django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited
জন উ

4
জ্যাঙ্গো 1.7 থেকে শুরু করে আপনার কাছে যুক্ত করার প্রয়োজন fields = '__all__'অধীনে class Meta:
স্কোল

4
আপনার নিজের ফর্মটি তৈরি করার দরকার নেই, আপনি get_formপদ্ধতিটি ওভাররাইড করতে পারেন । আমার উত্তর দেখুন ।
এক্স-ইউরি

বিটার পদ্ধতির ব্যবহার হল মেটা বর্গ মেটা: মডেল = বার্তা উইজেট = text 'পাঠ্য': ফর্ম.টেক্সাচারিয়া (প্রেরক = {'কলস': 80, 'সারি': 20}),}
অমূল্য আচার্য

58

এই ক্ষেত্রে, সর্বোত্তম বিকল্পটি সম্ভবত আপনার মডেলটিতে চারফিল্ডের পরিবর্তে কেবলমাত্র একটি টেক্সটফিল্ড ব্যবহার করা। আপনি formfield_for_dbfieldআপনার ModelAdminশ্রেণীর পদ্ধতিটি ওভাররাইড করতে পারেন :

class CabAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        formfield = super(CabAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        if db_field.name == 'descr':
            formfield.widget = forms.Textarea(attrs=formfield.widget.attrs)
        return formfield

বাছাই করা উত্তরের তুলনায় এর কোন নেতিবাচকতা আছে? আমাদের নতুন মডেলফর্ম তৈরি করার দরকার নেই বলে এটি বাস্তবায়নের জন্য আরও পরিষ্কার দেখাচ্ছে ...
ফিলিপ পিনা

4
টেক্সটফিল্ডের জন্য সমস্ত বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে উত্পন্ন করার জন্য প্রতিস্থাপন formfield.widget = forms.Textarea()করা formfield.widget = forms.Textarea(attrs=formfield.widget.attrs)হয়েছে, ধন্যবাদ!
ফিলিপ পিনা

4
আমি জানি না কেন এই উত্তরটির সাথে অন্য উত্তর গৃহীত হয়; আমি মনে করি আপনি যা করছেন তা যদি কোনও উইজেটের স্থান পরিবর্তন করে দেয় তবে এটি সহজ। তবে হয় ভাল কাজ করবে।
কার্ল মেয়ার

ধন্যবাদ এটি পুরোপুরি কাজ করেছে। সুপার () অনুরোধটি কিছুটা ভার্বোস মনে হলেও এটি করার সহজ উপায় আছে কি?
rjh

4
@rjh পিআই 3-তে আপনি প্যারেন্সের ভিতরে থাকা সমস্ত কিছুই মুছে ফেলতে পারেন এবং কেবল ব্যবহার করতে পারেন super()। অন্যথায় না।
কার্ল মায়ার

33

সামান্য পরিবর্তন (?!) ব্যতীত আইয়াজের বেশ কিছু জায়গা রয়েছে:

class MessageAdminForm(forms.ModelForm):
    class Meta:
        model = Message
        widgets = {
            'text': forms.Textarea(attrs={'cols': 80, 'rows': 20}),
        }

class MessageAdmin(admin.ModelAdmin):
    form = MessageAdminForm
admin.site.register(Message, MessageAdmin)

সুতরাং, আপনার উইজেটটি পরিবর্তন করতে মডেলফর্মের কোনও ক্ষেত্রকে নতুন সংজ্ঞা দেওয়ার দরকার নেই, কেবল মেটাতে উইজেটস ডিক সেট করুন।


4
এটি আইয়াজের উত্তরের চেয়ে বেশি "স্বয়ংক্রিয়" বৈশিষ্ট্য বজায় রাখে, তবে ক্ষেত্রের দৈর্ঘ্যের বৈধতা কীভাবে বজায় রাখা যায় সে সম্পর্কে কোনও পরামর্শ?
ফিলিপ পিনা

14

প্রয়োজনীয় formfieldপদ্ধতিতে আপনি নিজের ক্ষেত্রটি সাবক্লাস করতে পারেন :

class CharFieldWithTextarea(models.CharField):

    def formfield(self, **kwargs):
        kwargs.update({"widget": forms.Textarea})
        return super(CharFieldWithTextarea, self).formfield(**kwargs)

এটি সমস্ত উত্পন্ন ফর্মগুলিতে প্রভাব ফেলবে।


9

আপনার নিজেরাই ফর্ম শ্রেণি তৈরি করার দরকার নেই:

from django.contrib import admin
from django import forms

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        kwargs['widgets'] = {'descr': forms.Textarea}
        return super().get_form(request, obj, **kwargs)

admin.site.register(MyModel, MyModelAdmin)

ModelAdmin.get_for দেখুন ।


7

এর পরিবর্তে models.CharFieldএকটি models.TextFieldব্যবহার করুন descr


4
দুর্ভাগ্যক্রমে, টেক্সটফিল্ডে জ্যাঙ্গো দ্বারা সর্বোচ্চ_ দৈর্ঘ্য = সম্পূর্ণ উপেক্ষা করা হয়েছে, সুতরাং আপনার যখন ক্ষেত্রের দৈর্ঘ্যের বৈধতা প্রয়োজন (যেমন সচিবদের ইভেন্টের সংক্ষিপ্তরে প্রবেশ করতে দেওয়া) এটি পাওয়ার একমাত্র উপায় চার্ফিল্ড ব্যবহার করা। তবে একটি চারফিল্ড 300 টি অক্ষর টাইপ করতে সংক্ষিপ্ত উপায়। সুতরাং আইয়াজ সমাধান।
শ্যাকার

4
এটি একটি ভাল উত্তর নয় কারণ এটি ডাটাবেস পরিবর্তন করে। উইজেট পরিবর্তন করার বিষয়টি হ'ল ক্ষেত্রটি কীভাবে প্রদর্শিত হবে তা পরিবর্তন করা, ডাটাবেস স্কিমা পরিবর্তন করার জন্য নয়

4
এটি এমন একজনের জন্য দুর্দান্ত উত্তর (আমার মতো) যিনি কীভাবে জ্যাঙ্গো ব্যবহার করতে শিখছেন এবং যদি আমি আরও ভালভাবে জানতাম তবে প্রথম স্থানে ডাটাবেসটি আলাদাভাবে সেট আপ করতেন।
অ্যান্ড্রু সুইফট

7

আপনি যদি প্রশাসন.পি তে টেক্সটরিয়া পরিবর্তন করার চেষ্টা করছেন, এটি আমার জন্য কাজ করা সমাধানটি:

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

from books.models import Book

class BookForm(forms.ModelForm):
    description = forms.CharField( widget=forms.Textarea(attrs={'rows': 5, 'cols': 100}))
    class Meta:
        model = Book

class BookAdmin(admin.ModelAdmin):
    form = BookForm

admin.site.register(Book, BookAdmin)

আপনি যদি কোনও মাইএসকিউএল ডিবি ব্যবহার করে থাকেন তবে আপনার কলামের দৈর্ঘ্যটি সাধারণত 250 টি অক্ষরে স্বতন্ত্র হয়ে যায়, তাই আপনি নিজের মাইএসকিউএল ডিবিতে দৈর্ঘ্য পরিবর্তন করতে একটি অলটার টেবল চালাতে চান, যাতে আপনি নতুন বৃহত্তর টেক্সটরিয়ার সুযোগ নিতে পারেন আপনার অ্যাডমিন জ্যাঙ্গো সাইট আছে।


5

আপনি models.TextFieldএই উদ্দেশ্যে ব্যবহার করতে পারেন :

class Sample(models.Model):
    field1 = models.CharField(max_length=128)
    field2 = models.TextField(max_length=1024*2)   # Will be rendered as textarea

4
এটি ডিবি কাঠামো বদলে দেবে তাই
সতর্ক থাকুন

3

কার্ল মেয়ারের উত্তরটি প্রসারিত করতে চেয়েছিল, যা এই তারিখ পর্যন্ত পুরোপুরি কাজ করে।

আমি সর্বদা (বিকল্পের সাথে বা ছাড়াই) TextFieldপরিবর্তে ব্যবহার করি CharFieldএবং ডিবি স্তরের পরিবর্তে ইউআই / এপিআই পাশের অক্ষর সীমাবদ্ধতা আরোপ করি। এই কাজটি গতিশীল করার জন্য:

from django import forms
from django.contrib import admin


class BaseAdmin(admin.ModelAdmin):
    """
    Base admin capable of forcing widget conversion
    """
    def formfield_for_dbfield(self, db_field, **kwargs):
        formfield = super(BaseAdmin, self).formfield_for_dbfield(
            db_field, **kwargs)

        display_as_charfield = getattr(self, 'display_as_charfield', [])
        display_as_choicefield = getattr(self, 'display_as_choicefield', [])

        if db_field.name in display_as_charfield:
            formfield.widget = forms.TextInput(attrs=formfield.widget.attrs)
        elif db_field.name in display_as_choicefield:
            formfield.widget = forms.Select(choices=formfield.choices,
                                            attrs=formfield.widget.attrs)

        return formfield

আমি একটি মডেল নাম আছে Postযেখানে title, slug& stateহয় TextFields এবং stateপছন্দ হয়েছে। প্রশাসকের সংজ্ঞাটি দেখে মনে হচ্ছে:

@admin.register(Post)
class PostAdmin(BaseAdmin):
    list_display = ('pk', 'title', 'author', 'org', 'state', 'created',)
    search_fields = [
        'title',
        'author__username',
    ]
    display_as_charfield = ['title', 'slug']
    display_as_choicefield = ['state']

ভেবেছিলেন যে উত্তরগুলি খুঁজছেন অন্যেরা এটি দরকারী হতে পারেন।


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