Django的pipe理:CharField作为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 ) 

如何将TextArea小部件分配给pipe理界面中的“descr”字段?

UPD:
只在pipe理界面!

好主意使用ModelForm。

您将不得不创build一个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 

admin.ModelAdminform属性在官方的Django文档中有logging。 这里是一个地方看看 。

对于这种情况,最好的select可能只是在模型中使用TextField而不是CharField。 您也可以覆盖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 

阿亚兹有很多的发现,除了一个小小的变化(?!):

 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方法来formfield自己的领域:

 class CharFieldWithTextarea(models.CharField): def formfield(self, **kwargs): kwargs.update( "widget": forms.Textarea ) return super(CharFieldWithTextarea, self).formfield(**kwargs) 

这将影响所有生成的表单。

如果您正在尝试更改admin.py上的Textarea,则这是适用于我的解决scheme:

 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数据库,那么您的列长度通常会自动设置为250个字符,所以您将需要运行ALTER TABLE来更改MySQL DB的长度,以便您可以利用新的更大的Textarea有你在pipe理Django网站。

替代models.CharField ,请使用models.TextField来描述descr

想要扩展Carl Meyer的答案,直到今天,这个答案完美无缺。

我总是使用TextField而不是CharField (有或没有select),并在UI / API端而不是在数据库层上施加字符限制。 为了使这个工作dynamic:

 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 &和stateTextFieldstate有select。 pipe理定义如下所示:

 @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'] 

以为别人寻找答案可能会发现这有用。