我在Django中有一个模型A。非常典型,它具有多个字段,一些选择字段,一些布尔值和一些字符字段。
我有另一个模型B,在该模型中,预期的功能是在Django Admin中,第一个字段是select,用户可以在其中选择模型A中存在的任何字段。这已实现。我需要弄清楚的是如何使模型B的第二个字段模仿模型A的选项。
如果模型A有一个名为“肉类”的选择字段,并且选择的是“牛肉,火鸡和鸡肉”,则如果向模型B添加条目的用户在字段1中选择了“肉类”,则字段2将为“牛肉,土耳其和鸡肉”的选择字段。
如果模型A具有一个名为“ Anything Goes”的字符字段,则如果向模型B添加条目的用户在字段1中选择了“ Anything Goes”,则字段2将是标准的文本输入字段。
如果模型A是一个名为“是/否”的布尔值字段,则如果用户向模型B添加条目,则在字段1中选择了“是/否”,则字段2将是标准布尔值选择字段。
我相信我正在寻求帮助的主要事情是有一种方法来为链式选择/依赖下拉列表编写自定义代码,该方法不涉及预先实现的多对多或外键关系。
我不确定Django 2当前支持哪些库是一个很好的起点,或者我不确定如何自己编写与管理员一起使用的ajax。
-编辑-
似乎最好的解决方法是使用django-autocomplete-light。
URLS
re_path(r'^post-new-text/$',
views.PostNewTextView.as_view(),
name='post-new-text')
表格
class PostNormalizeForm(forms.ModelForm):
class Meta:
model = PostNormalize
widgets = {
'new_text': autocomplete.ListSelect2(url='post-new-text', forward=['target_field', 'check_field'])
}
fields = ('__all__')
观看次数
class PostNewTextView(autocomplete.Select2ListView):
def get_list(self):
target_field = self.forwarded.get('target_field', None)
check_field = self.forwarded.get('check_field', None)
if target_field == 'self':
target_field = check_field
choice_list = [str(choice[0]) for choice in Post._meta.get_field(target_field).choices]
return choice_list
基本上,您可以使用转发的输入来编写自己的基于列表的return来实现autocomplete.Select2ListView。在示例中,Post是模型A,PostNormalize是模型B。
在这一点上,剩下的就是要确定,如果转发的字段不是选择字段,那么如何在new_text字段中允许自由输入。