我有
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:
在管理员唯一接口!
使用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官方文档中.这是一个值得关注的地方.
对于这种情况,最好的选择可能只是在模型中使用TextField而不是CharField.您还可以覆盖类的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数据库,您的列长度通常会自动设置为250个字符,因此您需要运行ALTER TABLE来更改MySQL数据库中的长度,以便您可以利用新的更大的Textarea.在你的Admin Django网站.