[django] Django-Admin : CharField as TextArea
나는 가지고있다
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’필드에 TextArea 위젯을 할당하는 방법은 무엇입니까?
UPD :
에서 관리자 인터페이스 만!
ModelForm을 사용하는 것이 좋습니다.
답변
당신은 만들어야합니다 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
공식 Django 문서에 문서화되어 있습니다. 여기 에 살펴볼 곳이 있습니다.
답변
이 경우 가장 좋은 옵션은 모델에서 CharField 대신 TextField를 사용하는 것입니다. 클래스 의 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
답변
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 사이트에 있습니다.
답변
대신에 for를 models.CharField
사용하십시오 .models.TextField
descr