【问题标题】:How much can django.forms help me?django.forms 对我有多大帮助?
【发布时间】:2011-01-15 23:15:32
【问题描述】:

我有以下模型,它在 Person 和“Eprint”出版物之间形成多对多关系。每个人的个人资料页面都会显示通过此表引用的电子印记,但前提是 show=True,并且按“订单”字段的数字顺序:

class UsersEprint(models.Model):
    person = models.ForeignKey(Person)
    eprint = models.ForeignKey(emodels.Eprint) # this has a .title field
    show = models.BooleanField(default=True)
    order = models.IntegerField(default=0)

现在这一切都可以通过管理员进行管理,但我想要一个用户友好的表单进入网站的用户个人资料页面。

理想情况下,我想要一个表格,其中包含每个人的电子印刷品的一行,给出:电子印刷品标题(无法编辑)、“显示”复选框和“订单”数字字段。 “删除”复选框也很有用。

modelformsets 的默认方法为列出所有 eprint 的 eprint 提供了一个下拉选择器 - 这是因为表单不知道我不想编辑它。我已经尝试了各种方法来覆盖字段和小部件,但这一切似乎有点笨拙,而且我最终还是要在模板中逐行渲染表单,看起来。

下一个复杂之处在于,我可以使用 JavaScript 系统,而不是让用户输入数字来重新排列表格行,或者拖放行或向上/向下移动箭头。用户提交表单时,获取新订单。

我的问题是,在什么时候我会超出 django 的表单处理范围?我应该放弃 import django.forms 并自己管理吗?或者即使是最尴尬的形式,那里仍然有有用的部分?

【问题讨论】:

    标签: django forms django-forms


    【解决方案1】:

    我不认为您的用例特别尴尬,而且我确信InlineModelFormset 可以很好地满足您的所有要求。需要记住的是,Django 表单的主要关注点是输入数据的验证演示文稿由(并且应该)由您决定。

    当然,Django 提供了一些用于表单布局的基本工具(as_ul 等),但您不应该过于拘泥于它们。自定义表单的呈现方式不应被视为“黑客”,而是一项功能;-)

    1. 由于您不会编辑 eprint,你可以排除这个字段 从基础形式,你 传递给 inlinemodelformset_factory;在 你的模板,只显示 form.instance.eprint.title 改为 form.eprint (form.instance 指向底层模型 实例)

    2. 在渲染表单时 表单集,您可以检查 form.instance.show -- 如果是 True,然后渲染表单 一般。否则,要么添加一个 表单的“隐藏”类 容器,或将字段呈现为 隐藏输入 (form.<FIELD>.as_hidden)。 不幸的是,你不能简单地省略 他们,因为这会导致验证 服务器上的错误

    3. can_delete=True 传递给 inlinemodelformset_factory会 为每个添加一个 -DELETE 复选框 形式;你可以使用 jQuery 来隐藏 这个,而是呈现一个删除 按钮。单击时,按钮 设置复选框的值,并且 Django 处理剩下的事情。你可以看到 here

    4. 的一个例子
    5. 可以使用以下命令处理排序 像 jQuery UI 这样的工具包——看看this snippet 的想法。再次, 渐进增强是什么 你在这里;你所有的脚本都会 要做的是更新order 字段,然后让 Django 在您提交时处理实际保存。 这样,功能仍然存在,即使 如果 Javascript 被禁用(或 不存在)在客户端

    不要害怕探索和实验。并不是所有的 Django 都被记录在案,但是(使用源,Luke :) 如果您担心依赖于将来某个时候可能会被删除的功能,您可以随时在 Django Users

    上提问

    【讨论】:

    • 是否记录了 form.instance 属性?我在源代码中看到它,但在文档中没有。文档中有使用 instance= 创建 ModelForm 的示例(例如 f = ArticleForm(instance=a)) ,但这并不意味着 f.instance 是获取绑定对象的方法。我一直想知道模型表单和模型对象之间的联系在哪里......这显然是它,但我担心它没有记录。
    • 你是对的......它没有记录。我想这有点像Model._meta——它们都很有用,我希望最终核心开发人员让它们成为官方 API 的一部分。当然,除非出现更好的情况:)
    【解决方案2】:

    这个问题没有“好的”答案,但我个人认为这超出了范围;)正如您自己所说,您可以控制各种庄园中呈现的字段类型,但我同意,他们可以让它感觉“笨拙”。

    另外,您是否考虑过您的 javascript 系统背后的 html?你需要什么样的表单......如果视图期望由 Django 的表单处理呈现的表单,它将如何处理。你也许可以这样做,但我认为它会很快变得非常丑陋。

    我认为您最好从头开始设计带有表单的模板,以及处理视图。不幸的是,进行验证会花费您额外的工作,但我认为您将赢得更多时间让表单完全按照您的意愿执行。

    让我重复一遍,这确实是个建议,我相信你可以使用标准的表单处理,但如果我必须做同样的事情,我不会。

    【讨论】:

    • 是的,感谢您提供有用且“好”的答案!我刚刚发现了 jQuery 的 jqgrid 插件,它看起来非常有用,我只需要使用它即可。 google代码上有一个休眠的django-jqgrid项目,还有一堆其他的网络资源……
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多