【问题标题】:Django access data passed to formDjango 访问传递给表单的数据
【发布时间】:2011-03-04 12:54:51
【问题描述】:

我的表单中有一个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 传递)。

感谢任何帮助,因为我的想法已经不多了。

【问题讨论】:

    标签: python django forms django-forms django-models


    【解决方案1】:

    在我回答你的问题之前,这里有几个小问题。

    首先,您的字段可能应该是ModelChoiceField - 这需要一个queryset 参数,而不是一个选项列表,这避免了列表解析获取id 和值的需要。

    其次,您获取 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
                                              )
    

    【讨论】:

    • 谢谢,这就像一个魅力,但我不能使用type__name='group',因为ObjtreeObjtreeTypes 之间没有关系。我可以添加一个外键,但现在不需要。 +1
    猜你喜欢
    • 2017-12-31
    • 2020-04-13
    • 2014-04-04
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2010-12-31
    • 2021-05-20
    • 2017-08-31
    相关资源
    最近更新 更多