ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – Django中的ForeignKey表单限制

2019-07-05 11:07:53  阅读:135  来源: 互联网

标签:python django django-forms


我正在使用Django编写一个博客应用程序,我正在尝试实现一个分层类别结构.每个类别都有一个“父”ForeignKey,指向同一个Category模型.我想允许管理员添加类别,我希望界面允许他们选择类别的父类别.但是,我想避免我自己的爷爷情况,所以我想将类别的可用选择限制为那些没有作为祖先的类别的类别.

现在,我从视图中控制了这个:

parent_candidates = list(Category.objects.all())
pruned_parent_list = [cat for cat in parent_candidates if instance.id not in cat.getHierarchy()]

其中instance是要编辑的类别,getHierarchy()是获取祖先id列表的方法.

这种方法存在许多问题.特别是,它使用一个额外的数据库命中来获取所有类别的列表,它使我通过循环通过pruned_pa​​rent_list来获取选项,当我真的只是指定一个小部件时,将选择机制写入我的模板.

有没有更好的方法来做到这一点?我知道我可以在后端添加自定义验证来防止这种情况,但为什么要给用户提供选项呢?

解决方法:

如果我正确理解你的困境,那么问题本身就在于你处理哪些类别可以是父母而哪些类别不能成为父母的方式.避免这些问题的一个选择是实际上限制可以成为父母的类别的级别.例如,假设您有以下类别:

>互联网

>谷歌
>雅虎

>离线

> MS Office
> OpenOffice

我通常处理这个的方式是我在类别表上显然有一个parent_id FK.对于根元素(Internet,离线),parent_id将为0.因此,当您在视图中尝试检索下拉列表的“父类别”时,您需要确定它们可以在多长时间内保持嵌套.我主要将此限制在第一级,因此要选择在您的下拉列表中显示哪些类别,您需要执行以下操作:

parents = Category.objects.filter(parent_id=0)

现在很明显,这有点限制了这种方法,但你可以增加你想要包含的级别,并在模板中为下拉列表设计某种视觉识别系统(包括层次结构中每个级别的额外空格或破折号) ).

无论如何,对于长时间的回复感到抱歉,希望这有点解决了你的问题.

标签:python,django,django-forms
来源: https://codeday.me/bug/20190705/1386725.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有