django admin 一對多關聯驗證

應用場景

一條線有且只有一個參考站,在一次性保存的時候驗證參考站的唯一性。

踩過的坑

正確的寫法

  • 自定義個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自己的思路找文檔,找關鍵點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章