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自己的思路找文档,找关键点

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