Django-Admin: CharField as TextArea

前端 未结 9 2031
一个人的身影
一个人的身影 2020-12-07 09:20

I have

class Cab(models.Model):
    name  = models.CharField( max_length=20 )
    descr = models.CharField( max_length=2000 )

class Cab_Admin(admin.ModelAd         


        
相关标签:
9条回答
  • 2020-12-07 09:49

    For this case, the best option is probably just to use a TextField instead of CharField in your model. You can also override the formfield_for_dbfield method of your ModelAdmin class:

    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
    
    0 讨论(0)
  • 2020-12-07 09:51

    You don't need to create the form class yourself:

    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)
    

    See ModelAdmin.get_form.

    0 讨论(0)
  • 2020-12-07 09:58

    Instead of a models.CharField, use a models.TextField for descr.

    0 讨论(0)
  • 2020-12-07 10:00

    Ayaz has pretty much spot on, except for a slight change(?!):

    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)
    

    So, you don't need to redefine a field in the ModelForm to change it's widget, just set the widgets dict in Meta.

    0 讨论(0)
  • 2020-12-07 10:01

    You can use models.TextField for this purpose:

    class Sample(models.Model):
        field1 = models.CharField(max_length=128)
        field2 = models.TextField(max_length=1024*2)   # Will be rendered as textarea
    
    0 讨论(0)
  • 2020-12-07 10:03

    If you are trying to change the Textarea on admin.py, this is the solution that worked for me:

    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)
    

    If you are using a MySQL DB, your column length will usually be autoset to 250 characters, so you will want to run an ALTER TABLE to change the length in you MySQL DB, so that you can take advantage of the new larger Textarea that you have in you Admin Django site.

    0 讨论(0)
提交回复
热议问题