【问题标题】:Django form with object list带有对象列表的 Django 表单
【发布时间】:2014-07-23 15:30:48
【问题描述】:

提交后我无法从 django 表单中取回对象。

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

在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(我得到一个空值)。那可能吗 ?如果是,我该怎么做?

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    看看你用什么作为选择...MyObject 实例,真的吗? MyObject 实例应该如何作为 HTML 表单的一部分发送到浏览器,然后通过 POST 请求正文返回到您的服务器?

    如果您的每个 MyObject 实例都有一些持久的唯一标识符,请使用它作为您的选择,即

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

    请注意,它不会解决您的所有问题...然后您必须继承 TypedChoiceField 以根据其“id”等检索对象。

    【讨论】:

    • MyObject 是一个具有由另一个包创建的某些属性的对象(不打算保存在数据库中)。我认为这是不可能的...我没有唯一标识符,但我可以在views.py 中创建一个和一个字典,然后将列表传递给表单构造函数,并在使用此自定义 ID 进行表单验证后检索所选对象。谢谢。
    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2019-06-12
    相关资源
    最近更新 更多