带有对象列表的Django表单

4 投票
1 回答
1397 浏览
提问于 2025-04-18 14:27

我在提交一个django表单后,遇到了一个问题,就是无法从表单中获取到一个对象。

我有一个对象列表,这个列表里装的是MyObject,而不是django模型,这个列表是由另一个python包填充的。

models.py文件中,我有:

class MyObjectForm(forms.Form):

    def __init__(self, *args, **kwargs):
        # Get the list
        myobjects = kwargs.pop('myobjects')
        super(MyObjectForm, self).__init__(*args, **kwargs)
        choices = [(o, o.name) for o in myobjects]
        self.fields["my_objects"] = forms.TypedChoiceField(choices=choices)

顺便说一下,HTML看起来没问题。

views.py中,当我点击提交按钮时,form.is_valid()总是返回False。这有什么问题吗?

当我把models.py改成:

self.fields["my_objects"] = forms.TypedChoiceField(choices=choices, required=False)

views.py中,form.is_valid()返回True,但是我却无法获取到我的对象MyObject(我得到的是一个空值)。这可能吗?如果可以的话,我该怎么做呢?

1 个回答

3

看看你用作选择的内容... MyObject 实例,真的可以吗?一个 MyObject 实例怎么能作为 HTML 表单的一部分发送到浏览器,然后再通过 POST 请求发回你的服务器呢?

如果你为每个 MyObject 实例有一个持久的唯一标识符,那就用这个来作为选择,比如:

choices = [(o.some_stable_and_unique_id, o.name) for o in myobjects]

不过要注意,这并不能解决你所有的问题... 你还需要对 TypedChoiceField 进行子类化,以便根据它的 "id" 等信息来获取对象。

撰写回答