Django-Admin:CharField为TextArea

max*_*axp 79 django django-admin

我有

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 )
Run Code Online (Sandbox Code Playgroud)

如何在管理界面中将TextArea小部件分配给'descr'字段?

UPD:
管理员唯一接口!

使用ModelForm的好主意.

aya*_*yaz 89

您将必须创建一个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
Run Code Online (Sandbox Code Playgroud)

form属性admin.ModelAdmin记录在Django官方文档中.这是一个值得关注的地方.

  • 要简单地替换表单小部件,您不必创建自己的整个表单.您可以在您的`ModelAdmin`上覆盖`formfield_for_dbfield`,请参阅下面的答案. (5认同)
  • 从Django 1.7开始,你需要在`class Meta:`下添加`fields ='__ all __'`. (3认同)
  • 您不需要自己创建表单,可以覆盖`get_form`方法。参见[我的答案](/sf/answers/3536510631/)。 (2认同)

Car*_*yer 52

对于这种情况,最好的选择可能只是在模型中使用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
Run Code Online (Sandbox Code Playgroud)

  • 将 `formfield.widget = forms.Textarea()` 替换为 `formfield.widget = forms.Textarea(attrs=formfield.widget.attrs)` 以保持为 TextField 自动生成所有属性,谢谢! (3认同)
  • 我不知道为什么另一个答案会被这个答案接受;我认为如果你所做的只是更换一个小部件,这会更简单。但两者都可以正常工作。 (2认同)
  • @rjh在py3中你可以消除parens中的所有内容,只需使用`super()`.否则没有. (2认同)

Gez*_*zim 31

除了稍微改变(?!)之外,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)
Run Code Online (Sandbox Code Playgroud)

因此,您不需要重新定义ModelForm中的字段来更改它的窗口小部件,只需在Meta中设置窗口小部件字典即可.


Ale*_*lev 13

您可以使用所需formfield方法为您自己的字段创建子类:

class CharFieldWithTextarea(models.CharField):

    def formfield(self, **kwargs):
        kwargs.update({"widget": forms.Textarea})
        return super(CharFieldWithTextarea, self).formfield(**kwargs)
Run Code Online (Sandbox Code Playgroud)

这将对所有生成的表单产生影响.


x-y*_*uri 7

您不需要自己创建表单类:

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)
Run Code Online (Sandbox Code Playgroud)

请参见ModelAdmin.get_form.


mip*_*adi 6

models.CharField使用models.TextFieldfor代替a descr

  • 不幸的是,Django 在 TextField 上完全忽略了 max_length=,因此当您需要字段长度验证(例如让秘书输入事件摘要)时,获得它的唯一方法是使用 CharField。但是 CharField 是一种可以输入 300 个字符的简短方法。因此,ayaz 解决方案。 (4认同)
  • 这不是一个好的答案,因为它会更改数据库。更改小部件的重点是更改字段的显示方式,而不是更改数据库架构 (3认同)

Aar*_*ier 5

如果您尝试在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)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MySQL数据库,您的列长度通常会自动设置为250个字符,因此您需要运行ALTER TABLE来更改MySQL数据库中的长度,以便您可以利用新的更大的Textarea.在你的Admin Django网站.


vk-*_*ode 5

您可以models.TextField为此目的使用:

class Sample(models.Model):
    field1 = models.CharField(max_length=128)
    field2 = models.TextField(max_length=1024*2)   # Will be rendered as textarea
Run Code Online (Sandbox Code Playgroud)

  • 这会改变数据库结构所以要小心 (3认同)