【问题标题】:Hidden field in Django ModelDjango 模型中的隐藏字段
【发布时间】:2011-01-06 08:59:30
【问题描述】:

不久前我做了一个模型类。我为它制作了几个 ModelForms,效果很好。

我最近不得不向它添加另一个可选(空白=True,null=True)字段,以便我们可以存储用户之间的一些关系数据。它本质上是一个推荐系统。

问题是添加这个新字段意味着推荐字段显示在我没有更改 ModelForms 以排除它的地方。通常这意味着需要额外 10 分钟的时间来排除它们,但在这种情况下,由于我无法控制项目管理政治,我只能控制此应用程序的模型。

我可以:

  • 将该字段设置为自动排除?
  • 将其设置为隐藏(如果不完美也可以接受)?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    如果您有权访问该模板,则可以使用以下代码将其呈现为具有隐藏字段:

    {{ form.field_name.as_hidden }}
    

    代替标准:

    {{ form.field_name }}
    

    【讨论】:

    • 您是如何找出“as_hidden”属性的?我在 django 文档中找不到它。我也试图弄清楚如何使用它,现在我知道了,谢谢你。
    • 我通过阅读 django 源代码找到了答案。我真的可以推荐查看 django 的源代码。它非常容易理解且结构良好。
    • 是的,as_hidden 很酷,但要注意,它不适用于多值字段(例如 MultipleChoiceField 和可能的其他字段)。
    【解决方案2】:

    来自Using a subset of fields on the form 上的文档:

    在模型字段上设置 editable=False。因此,通过 ModelForm 从模型创建的任何表单都不会包含该字段。

    【讨论】:

    • 魔术。完全按照我的需要工作。谢谢!
    • 你不得不承认,这没有多大意义。如果我想要一个字段是只读的怎么办?这就是 editable=False 应该做的,而不是隐藏它。
    • @JustinY 我的想法完全正确。
    【解决方案3】:

    您可以定义自定义模型字段子类并覆盖 formfield() 方法以返回带有 HiddenInput 小部件的字段。见the documentation for custom fields

    【讨论】:

    • 是的,我在 Ofri 回答之前就在看这个。坦率地说,我很高兴有一种简单的方法来做我想做的事,但当然有些场景确实需要自定义字段。谢谢你的回答。
    【解决方案4】:

    虽然您提到您不能在您的案例中使用排除,但我认为遇到此答案的其他人(例如我自己,根据标题)可能会觉得它有帮助。

    可以在 ModelAdmin 中使用 exclude 选择性地隐藏字段,这是我正在处理的东西的 sn-p:

    class ItemsAdmin(admin.ModelAdmin):
        form = ItemsForm
        actions = None
        list_display = ('item_id', 'item_type', 'item_title', 'item_size', 'item_color',)
        search_fields = ('item_id', 'item_title',)
        inlines = [ImageInline,]
        readonly_fields = ('disable_add_date','disable_remove_date',)
        exclude = ('add_date', 'remove_date',)
        ###.............
    

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2011-06-08
      • 2016-05-31
      • 2011-02-16
      • 2016-02-14
      • 2011-10-08
      • 2010-12-11
      • 1970-01-01
      • 2016-10-10
      相关资源
      最近更新 更多