"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 на страницах "Добавить" и "Изменить" , как показано ниже:

enter image description here

enter image description here

Теперь, есть ли разница между 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 на странице <"Список изменений" , как показано ниже:

enter image description here

Но, если сделать 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 на странице <"Список изменений" , как показано ниже:

enter image description here

Вернуться на верх