Django Admin中的链式选择/从属下拉列表

时间:2018-10-18 01:49:19

标签: django python-3.x django-admin django-autocomplete-light

我在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字段中允许自由输入。

0 个答案:

没有答案
相关问题