[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.TextFielddescr