代码之家  ›  专栏  ›  技术社区  ›  maxp

Django管理员:CharField作为TextArea

  •  72
  • maxp  · 技术社区  · 17 年前

    我有

    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 )
    

    upd:
    在里面 仅限界面!

    使用ModelForm是个好主意。

    9 回复  |  直到 15 年前
        1
  •  103
  •   IntrepidDude    13 年前

    您必须创建一个 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官方文件中。这是 one place to look at .

        2
  •  61
  •   Carl Meyer    14 年前

    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
    
        3
  •  35
  •   Gezim Tarang    15 年前

    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中设置小部件dict。

        4
  •  14
  •   Ashish Gupta    7 年前

    formfield 方法:

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

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

        5
  •  12
  •   x-yuri    8 年前

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

    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 .

        6
  •  8
  •   Aaron Lelevier    12 年前

    如果您试图更改admin.py上的文本区域,这是一个适合我的解决方案:

    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)
    

        7
  •  6
  •   mipadi    17 年前

    而不是 models.CharField models.TextField 对于 descr .

        8
  •  5
  •   Stephen Rauch Afsar Ali    8 年前

    你可以用 models.TextField 为此目的:

    class Sample(models.Model):
        field1 = models.CharField(max_length=128)
        field2 = models.TextField(max_length=1024*2)   # Will be rendered as textarea
    
        9
  •  3
  •   tarequeh    9 年前

    我总是用 TextField 而不是 CharField (带或不带选项)并在UI/API端而不是在DB级别施加字符限制。要使其动态工作,请执行以下操作:

    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

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

    我想其他寻找答案的人可能会觉得这很有用。