django admin 一对多关联验证

    xiaoxiao2022-07-15  167

    文章目录

    应用场景踩过的坑正确的写法总结

    应用场景

    一条线有且只有一个参考站,在一次性保存的时候验证参考站的唯一性。

    踩过的坑

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

    最新回复(0)