Ответ 1
Я бы предложил вам подкласс modelform для Foo
(FooAdminForm), чтобы добавить ваши собственные поля, не поддерживаемые базой данных. Ваша пользовательская проверка может находиться в методах clean_*
ModelForm.
Внутри метода save_model
FooAdmin
вы получите запрос, экземпляр Foo
и данные формы, чтобы вы могли выполнять всю обработку данных до/после сохранения экземпляра.
Вот пример модели с пользовательской формой, зарегистрированной в django admin:
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)
Предоставление начальных значений для настраиваемых полей на основе данных экземпляра
(Я не уверен, что это лучшее решение, но оно должно работать.)
Когда модель модели для существующего экземпляра модели в базе данных сконструирована, он получает этот экземпляр. Таким образом, в FooAdminForm __init__
можно изменить атрибуты полей на основе данных экземпляра.
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)