私が持っています
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を使用することをお勧めします。
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.ModelAdmin
のform
属性は、公式のDjangoドキュメントに記載されています。ここに 1つの場所 があります。
この場合、おそらく最良のオプションは、モデルで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
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でウィジェットの辞書を設定するだけです。
必要なformfield
メソッドで独自のフィールドをサブクラス化できます:
class CharFieldWithTextarea(models.CharField):
def formfield(self, **kwargs):
kwargs.update({"widget": forms.Textarea})
return super(CharFieldWithTextarea, self).formfield(**kwargs)
これは、生成されたすべてのフォームに影響します。
自分でフォームクラスを作成する必要はありません。
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 を参照してください。
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サイト。
models.CharField
の代わりに、descr
にmodels.TextField
を使用します。
カール・マイヤーの答えを拡張したかったが、それはこの日付まで完全に機能する。
私は常に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
で、title
、slug
、およびstate
はTextField
sであり、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']
答えを探している他の人はこれが役に立つと思うかもしれません。
この目的でmodels.TextField
を使用できます。
class Sample(models.Model):
field1 = models.CharField(max_length=128)
field2 = models.TextField(max_length=1024*2) # Will be rendered as textarea