Я бы предложил вам создать подкласс модели формы для Foo
(FooAdminForm), чтобы добавить свои собственные поля, не поддерживаемые базой данных.Ваша пользовательская проверка может находиться в clean_*
методах ModelForm.
Внутри save_model
метода FooAdmin
вы получаете запрос, экземпляр Foo
и данные формы, так что вы можете сделатьвся обработка данных до / после сохранения экземпляра.
Вот пример модели с пользовательской формой, зарегистрированной администратором django:
from django import forms
from django.db import models
from django.contrib import admin
class Foo(models.Model):
name = models.CharField(max_length=30)
class FooAdminForm(forms.ModelForm):
# custom field not backed by database
calculated = forms.IntegerField()
class Meta:
model = Foo
class FooAdmin(admin.ModelAdmin):
# use the custom form instead of a generic modelform
form = FooAdminForm
# your own processing
def save_model(self, request, obj, form, change):
# for example:
obj.name = 'Foo #%d' % form.cleaned_data['calculated']
obj.save()
admin.site.register(Foo, FooAdmin)
Предоставлениеначальные значения для настраиваемых полей на основе данных экземпляра
(я не уверен, что это лучшее решение, но оно должно работать.)
Когда модель формирует существующую модельэкземпляр в базе данных создан, ему передается этот экземпляр.Таким образом, в __init__
FooAdminForm можно изменять атрибуты полей на основе данных экземпляра.
def __init__(self, *args, **kwargs):
# only change attributes if an instance is passed
instance = kwargs.get('instance')
if instance:
self.base_fields['calculated'].initial = (instance.bar == 42)
forms.ModelForm.__init__(self, *args, **kwargs)