【问题标题】:Passing a model instance, not __unicode__ method in django传递模型实例,而不是 Django 中的 __unicode__ 方法
【发布时间】:2012-07-13 16:42:12
【问题描述】:

我有一个包含通过外键连接的 django 表单。这是一个非常大的表的外键。在表单上,​​为了防止加载大量可能导致浏览器崩溃的选择,我有一个 jQuery 自动完成功能,它会在每次击键时发送输入的文本。然后在表格中搜索此文本并返回合适的结果以进行显示。 The id is then passed to a hidden CharField when one is selected.这个隐藏的 CharField 是 ForeignKey 关系的小部件。当我尝试保存表单时,我收到一个错误,我需要为相关模型传递模型实例,这很公平。但是,我不知道该怎么做。我可以使用该 id 并执行 model.objects.get(pk=id_from_form),但如果我用此结果替换 POST 数据,我仍然会收到错误,因为我只是传递模型的 __unicode__ 方法。我确定我缺少某些东西,但我看不到它是什么。

谢谢。

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    不要使用CharField 来存储ID,而是尝试使用ModelChoiceField 并将小部件设置为HiddenInput。表单中的字段定义如下所示:

    mymodel = forms.ModelChoiceField(widget=forms.HiddenInput, queryset=MyModel.objects.all())
    

    【讨论】:

    • 虽然我可以这样做,但我真的不想这样做,因为我想避免将相关模型中的每个项目都加载到表单中。最初,该表包含约 8000 行,并且随着时间的推移只会增加。根据经验,加载这么多数据的速度很慢,并且很容易使浏览器陷入困境,尤其是在速度较慢的机器上。
    • 在默认选择小部件的情况下,应用程序和浏览器确实需要加载所有 8000 行。如果您使用 HiddenInput 小部件,则验证都是使用提供的 QuerySet 在服务器端执行的,并且永远不会由浏览器加载。此外,应该对 QuerySet 进行惰性求值,这样所有 8000 行都不会真正从数据库中检索到。
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 2012-05-08
    • 2016-02-06
    • 2011-08-21
    • 1970-01-01
    • 2015-03-05
    • 2013-04-10
    • 2011-04-05
    相关资源
    最近更新 更多