"formfield_overrides" vs "formfield_for_dbfield()" vs "form" vs "get_form()" для изменения ширины поля в Django Admin
Например, существует Person
модель ниже:
# "models.py"
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
age = models.PositiveSmallIntegerField()
def __str__(self):
return self.name
Тогда, при использовании formfield_overrides, formfield_for_dbfield(), form или get_form() ниже:
# "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):
formfield_overrides = { # Here
models.PositiveSmallIntegerField: {
'widget': forms.NumberInput(attrs={'style': 'width:100ch'})
},
}
Or:
# "admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin): # Here
def formfield_for_dbfield(self, db_field, request, **kwargs):
field = super().formfield_for_dbfield(db_field, request, **kwargs)
if db_field.name == 'age':
field.widget.attrs['style'] = 'width: 100ch'
return field
Or:
# "admin.py"
from django.contrib import admin
from .models import Person
from django import forms
class PersonForm(forms.ModelForm):
age = forms.CharField(
widget=forms.NumberInput(attrs={'style':'width:100ch'})
)
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
form = PersonForm # Here
Or:
# "admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin): # Here
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
form.base_fields['age'].widget.attrs['style'] = 'width: 100ch;'
return form
Я могу изменить ширину поля age
на страницах "Добавить" и "Изменить" , как показано ниже:
Теперь, есть ли разница между formfield_overrides
, formfield_for_dbfield()
, form
и get_form()
для изменения ширины поля в Django Admin?
formfield_overrides или formfield_for_dbfield() также может изменить ширину поля на "Change List" странице в дополнение к "Добавить" и "Изменить" страницам в Django Admin, в то время как form или get_form() не могут.
Итак, если сделать age
поле просматриваемым и редактируемым с помощью list_display и list_editable для formfield_overrides
или formfield_for_dbfield()
, как показано ниже:
# "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 = ('name', 'age') # Here
list_editable = ('age',) # Here
formfield_overrides = {
models.PositiveSmallIntegerField: {
'widget': forms.NumberInput(attrs={'style': 'width:100ch'})
},
}
Or:
# "admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age') # Here
list_editable = ('age',) # Here
def formfield_for_dbfield(self, db_field, request, **kwargs):
field = super().formfield_for_dbfield(db_field, request, **kwargs)
if db_field.name == 'age':
field.widget.attrs['style'] = 'width: 100ch'
return field
Вы можете изменить ширину поля age
на странице <"Список изменений" , как показано ниже:
Но, если сделать age
поле просматриваемым и редактируемым с помощью list_display и list_editable для form
или get_form()
, как показано ниже:
# "admin.py"
from django.contrib import admin
from .models import Person
from django import forms
class PersonForm(forms.ModelForm):
age = forms.CharField(
widget=forms.NumberInput(attrs={'style':'width:100ch'})
)
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age') # Here
list_editable = ('age',) # Here
form = PersonForm
Or:
# "admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age') # Here
list_editable = ('age',) # Here
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
form.base_fields['age'].widget.attrs['style'] = 'width: 100ch;'
return form
Вы не можете изменить ширину поля age
на странице <"Список изменений" , как показано ниже: