【问题标题】:Only display field value from a class form in Django仅在 Django 中显示类表单中的字段值
【发布时间】:2016-12-15 18:12:20
【问题描述】:

我有一个包含一些字段的模型。考虑下面的模型。

class Item(models.Model):
    a = models.CharField(max_length=200)
    b = models.BooleanField(default=False)
    c = models.CharField(max_length=200)

对应模型的表单类。

class ItemForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    class Meta:
        model = Item
        localized_fields = '__all__'
        fields = [
            'a',
            'b',
            'c',
        ]

还有表单的视图。视图类使用显示所有字段的模板。但只有当 字段 b 为真时,才会显示 字段 c

{% if form.b.value %}
    {% form.c %}
{% endif %}

c 字段不可编辑,我只想显示已经预定义的值。

问题是,如果我在模板中使用if 条件,(假设b 为假)当我加载表单时,它会显示2 个字段ab,当我提交表单时b 设置为 true,表单重新加载而不保存显示所有三个字段,字段 c 的值为空白。

字段c 已经有一个值并且它存在于数据库中,但它没有显示出来。这是为什么呢?

编辑:这是我的观点,很简单

class ItemGeneral(UpdateView):
    form_class = ItemUpdateForm
    template_name = 'pretixcontrol/item/index.html'
    permission = 'can_change_items'

    @transaction.atomic()
    def form_valid(self, form):
        # some code
        return super().form_valid(form)

【问题讨论】:

  • 您可以尝试将 c 设置为只读而不是不可编辑吗?那它有用吗?

标签: django python-3.x django-forms django-views


【解决方案1】:

为了使 c 不可编辑,我将使用 Django 1.9 中的 Field.disabled 新属性。如果您是 1.8 或更高版本,请参阅此帖子了解如何使用它以及如何操作:

In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

就保存问题而言,我必须查看您的观点才能确定,但​​听起来在表单验证期间可能会出现问题。您的表单将需要所有三个字段,因为这就是它的初始化方式,但是您的模板可以删除一个独立于视图逻辑的字段。当三个预期字段中只有两个通过form.is_valid() 时,问题可能会出现?

c 总是暴露在页面源中是否可以接受?您可以在所有情况下正常呈现表单,然后使用 jQuery/JS 检查字段 b 的值,并有条件地检查 .hide 它。

或者,您可以在视图中检查模型的属性,并有条件地检查 remove a field from the form's self.fields dictoverride the init method.

【讨论】:

  • 这似乎是一个好方法,使用 JS 将是一个很好的方法来监听字段 b 的变化,然后根据字段 b 的值切换两个字段 c。您可以使用form.widgets 将属性添加到字段并将属性设置为只读。
  • Field.disabled 成功了。我不知道我是怎么错过的。谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2011-10-11
  • 2021-01-22
  • 2016-02-24
  • 2011-02-22
相关资源
最近更新 更多