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.ModelAdmin
的form
属性在官方的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
title
, slug
&和state
是TextField
和state
有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']
以为别人寻找答案可能会发现这有用。
- Django – 如何创build一个文件并将其保存到模型的FileField?
- 将variables分配给{%include%}标签Django中的子模板
- 如何使用redis和Django?
- 如何在MySQL中暂时禁用外键约束?
- 什么是正确的方式来validation,如果一个对象存在于Django视图而不返回404?
- 您需要安装用于构build服务器端扩展的postgresql-server-dev-XY或用于构build客户端应用程序的libpq-dev
- Django ModelChoiceField:过滤查询集并将默认值设置为对象
- 什么是最好的Django模型领域用来代表美元的金额?
- Django的 – 如何做一个模板中的元组解开'循环'