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'})},
}
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)
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:
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:
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:
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'})},
}
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)
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:
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:
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: