應用場景
一條線有且只有一個參考站,在一次性保存的時候驗證參考站的唯一性。
踩過的坑
- 試圖重寫save_model和save_relate在存儲過程中攔截並添加報錯,結果徒勞無功
正確的寫法
- 自定義個formset類並重寫裏面的clean方法,如果不合邏輯直接拋異常,官方出處
class StationFormSet(BaseInlineFormSet):
def clean(self):
super().clean()
exist = False
for form in self.forms:
is_bottleneck = form.cleaned_data.get('is_bottleneck')
if is_bottleneck and exist:
raise forms.ValidationError('there is only one')
elif is_bottleneck:
exist = True
然後就是在inline admin類裏面注入formset,官方出處
class StationInLine(admin.StackedInline):
model = Station
fields = (('name', 'db_id'), ('serial_number', 'is_bottleneck'))
formset = StationFormSet
最後就是添加到model admin 了,官方出處
@admin.register(Line)
class LineAdmin(admin.ModelAdmin):
fields = (('name', 'serial_number'),)
inlines = [StationInLine, ]
成功!
總結
其實django的官方文檔很全,功能也很強大,但是你不能按照spring或者.net的思路去找,必須按照django自己的思路找文檔,找關鍵點