我的表单中有一个choiceField
,我在其中显示过滤后的数据。要过滤数据,我需要两个参数。第一个不是问题,因为我可以直接从一个对象获取它,但第二个是动态生成的。这是一些代码:
class GroupAdd(forms.Form):
def __init__(self, *args, **kwargs):
self.pid = kwargs.pop('parent_id', None)
super(GroupAdd, self).__init__(*args, **kwargs)
parent_id = forms.IntegerField(widget=forms.HiddenInput)
choices = forms.ChoiceField(
choices = [
[group.node_id, group.name] for group in Objtree.objects.filter(
type_id = ObjtreeTypes.objects.values_list('type_id').filter(name = 'group'),
parent_id = 50
).distinct()] + [[0, 'Add a new one']
],
widget = forms.Select(
attrs = {
'id': 'group_select'
}
)
)
我想更改传递给Objtree.objects.filter
的parent_id。你可以看到我在init函数中尝试过kwargs['initial']['parent_id']
,然后用self
调用它,但这不起作用,因为它超出范围......这几乎是我最后的努力。我需要通过initial
参数或直接通过parent_id
字段来处理它,因为它已经保持其值(通过initial
传递)。
任何帮助都表示赞赏,因为我的想法已经用完了。
答案 0 :(得分:2)
在我回答你的问题之前,请先确定几个小问题。
首先,你的字段可能应该是ModelChoiceField
- 这需要一个queryset
参数,而不是一个选项列表,这样就不需要列表理解来获取id和value。
其次,使用双下划线表示法来描述获取Objtree对象的查询要好得多,以便遍历关系:
Objtree.objects.filter(type__name='group', parent_id=50)
现在,实际的问题。如您所知,您无法在字段声明中访问本地或实例变量。这些是类级属性,在定义类时(而不是在实例化时)处理(通过元类)。所以你需要在__init__
中完成整个事情。
像这样:
class GroupAdd(forms.Form):
parent_id = forms.IntegerField(widget=forms.HiddenInput)
choices = forms.ModelChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
pid = kwargs.pop('parent_id', None)
super(GroupAdd, self).__init__(*args, **kwargs)
self.fields['choices'].queryset = Objtree.objects.filter(
type__name='group', parent_id=pid
)