我有两个字段category
和subcategory
,如下所示
CATEGORY = {
'Fruit': ['Apple', 'Pear', 'Watermelon'],
'Cell': ['Sumsung', 'Apple', 'Huawei'],
'OS': ['OS X', 'IOS', 'Android', 'Linux']
}
所以类别是['Fruit', 'Cell Brand', 'OS']
,每个类别都有自己的子类别。
现在我有了表格:
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ('category', 'subcategory')
category = forms.CharField(widget=forms.Select)
subcategory = forms.CharField(widget=forms.Select)
def __init__(self, *args, **kwargs):
self.instance = kwargs.get('instance', '')
self.data = kwargs.get('data', '')
self.category_choice = CATEGORY
self.fields['category'].widget.choice = self.init_category()
self.fields['category'].widget.attrs['data-choices'] = self.category_choice
self.fields['subcategory'].widget.choice = self.init_subcategory()
def init_category(self):
cat_lst = sorted([key for key in self.category_choice])
return ((key, key) for key in cat_lst)
def init_subcategory(self):
if not self.instance:
return ((key, key) for key in self.category_choice['Cell'])
elif not self.instance.category:
return ((key, key) for key in self.category_choice[self.data['category']])
return ((key, key) for key in self.category_choice[self.instance.category])
我想解释一下'init_subcategory'方法,它对我来说看起来很难看。通常我想按类别值启动子类别选择。有三种情况:1。创建一个新表单:这应该是我想的无限形式,然后我返回第一个项目的子类别Cell
。 2.编辑表单,因此我们应该使用存储在实例中的值来呈现类别和子类别。 3.表单返回有错误,在这种情况下应该有数据绑定到表单。
由于我已将CATEGORY
传递给前端,因此我可以根据类别字段更改使用javascript来操作子类别字段选项。
所以我的问题是,有没有更好的方法来实现我想要的东西?或者这里有任何改进。非常感谢任何建议。