How to change size of CharField

Question:

This code is changing sizes of all CharFields in class. How I can change size of one CharField?

formfield_overrides = {
    models.CharField: {'widget': TextInput(attrs={'size': '20'})},
}
Asked By: SBrain

||

Answers:

Define a custom model form that overrides the widget for your field:

from django import forms

class MyForm(forms.ModelForm):
    class Meta:
        widgets = {
            'my_field': forms.TextInput(attrs={'size': '20'}),
        }

Then use your form in your model admin:

class MyModelAdmin(admin.ModelAdmin):
    form = MyForm
    ...

Note that setting TextInput(attrs={'size': '20'}) will only affect the way that the form field is displayed in the model admin. If you want to change the length of the column in the database you should set max_length instead.

class MyModel(models.Model):
    my_field = models.CharField(max_length=20)
Answered By: Alasdair

For example, there are first_name and last_name fields which are both CharField() in Person model below:

# "models.py"

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=20) # Here
    last_name = models.CharField(max_length=20) # Here

Then, the 2 sets of code below can only change the size of first_name field by assigning PersonForm to form in PersonAdmin:

# "admin.py"

from django import forms
from django.contrib import admin
from .models import Person

class PersonForm(forms.ModelForm): # Here
    class Meta:
        widgets = {
            'first_name': forms.TextInput(attrs={'size':'10'}),
        }

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    form = PersonForm # Here

Or:

# "admin.py"

from django import forms
from django.contrib import admin
from .models import Person

class PersonForm(forms.ModelForm): # Here
    first_name = forms.CharField(
        widget=forms.TextInput(attrs={'size':'10'})
    )

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    form = PersonForm # Here

Then, only the size of first_name field is changed on "Add" and "Change" pages as shown below:

enter image description here

enter image description here

But, assigning PersonForm to form in PersonAdmin doesn’t change the size of first_name field on "Change List" page.

So, if making first_name and last_name fields editable as shown below:

# "admin.py"

# ...

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name') # Here
    list_editable = ('first_name', 'last_name') # Here
    list_display_links = None # Here
    
    form = PersonForm

Then, the size of first_name field is not changed on "Change List" page as shown below:

enter image description here

But, if using formfield_overrides as shown below:

# "admin.py"

from django.contrib import admin
from .models import Person
from django.db import models
from django import forms

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name')
    list_editable = ('first_name', 'last_name') 
    list_display_links = None # Here
    
    formfield_overrides = { # Here
        models.CharField: {'widget': forms.TextInput(attrs={'size': '10'})},
    }

The size of not just first_name field but also last_name field is changed on "Change List" page as shown below. *I don’t know how to change only first_name field on "Change List" page:

enter image description here

Answered By: Kai – Kazuya Ito