web-dev-qa-db-ja.com

Django-Admin:TextAreaとしてのCharField

私が持っています

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 )

textAreaウィジェットを管理インターフェイスの「descr」フィールドに割り当てる方法

upd:
InAdminインターフェースのみ!

ModelFormを使用することをお勧めします。

76
maxp

descrフィールドの表示方法を説明するforms.ModelFormを作成し、そのフォームを使用するよう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

admin.ModelAdminform属性は、公式のDjangoドキュメントに記載されています。ここに 1つの場所 があります。

88
ayaz

この場合、おそらく最良のオプションは、モデルでCharFieldの代わりにTextFieldを使用することです。 ModelAdminクラスのformfield_for_dbfieldメソッドをオーバーライドすることもできます。

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
52
Carl Meyer

Ayazは、わずかな変更(?!)を除いて、ほとんどスポットを当てています:

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)

したがって、ウィジェットを変更するためにModelFormのフィールドを再定義する必要はありません。Metaでウィジェットの辞書を設定するだけです。

31
Gezim

必要なformfieldメソッドで独自のフィールドをサブクラス化できます:

class CharFieldWithTextarea(models.CharField):

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

これは、生成されたすべてのフォームに影響します。

13
Alex Koshelev

自分でフォームクラスを作成する必要はありません。

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_form を参照してください。

7
x-yuri

Admin.pyのTextareaを変更しようとしている場合、これは私のために働いた解決策です:

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)

MySQL DBを使用している場合、通常、列の長さは250文字に自動設定されるため、ALTER TABLEを実行してMySQL DBの長さを変更すると、新しい大きなTextareaを活用できます。 Admin Djangoサイト。

5
Aaron Lelevier

models.CharFieldの代わりに、descrmodels.TextFieldを使用します。

3
mipadi

カール・マイヤーの答えを拡張したかったが、それはこの日付まで完全に機能する。

私は常にTextFieldの代わりにCharField(選択の有無にかかわらず)を使用し、DBレベルではなくUI/API側に文字制限を課しています。これを動的に機能させるには:

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で、titleslug、およびstateTextFieldsであり、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']

答えを探している他の人はこれが役に立つと思うかもしれません。

3
tarequeh

この目的でmodels.TextFieldを使用できます。

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