带有对象列表的Django表单
我在提交一个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" 等信息来获取对象。