【问题标题】:Django hide field when creating new object创建新对象时Django隐藏字段
【发布时间】:2016-10-14 18:03:16
【问题描述】:

我想在用户创建新对象时隐藏字段名称,但如果用户想编辑此对象,它必须是可见的。 我尝试了排除方法,但是当我尝试编辑此字段时它使字段不可见。例如我想隐藏状态字段。

class Toys(BaseModel):
    name = models.CharField(max_length=255)
    tags = models.ManyToManyField(Tag, related_name='Item_tags')
    price = models.CharField(max_length=255)
    status = models.BooleanField(default=False)

【问题讨论】:

  • 一种方法是使用 CSS 隐藏类名
  • 我想在 django 管理面板中隐藏这个字段。还有其他方法吗?

标签: python django


【解决方案1】:

在您在admin.py 文件中注册的模型管理员中,您可以重载get_form(self, request, obj=None, **kwargs) 方法。如您所见,它采用 obj 参数,仅在添加时为 None(在更改时不是 None)。 只有obj is None.

在 Django 1.10 中,该方法位于 django.contrib.admin.options.ModelAdmin.get_form

EDIT 1这不是最好的解决方案) 我无法在这里为您提供完整的解决方案,但您可以从以下内容开始:

# admin.py

from django.contrib import admin

from models import Toys


class ToysModelAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        # all the code you have in the original
        # django.contrib.admin.options.ModelAdmin.get_form
        # up to the last try except

        if obj is not None:
            defaults['fields'] = ('tags', 'price', 'status', )

        try:
            return modelform_factory(self.model, **defaults)
        except FieldError as e:
            raise FieldError(
                '%s. Check fields/fieldsets/exclude attributes of class %s.'
                % (e, self.__class__.__name__)
            )

admin.site.register(Toys, ToysModelAdmin)

EDIT 2这是一个更好的例子

# admin.py

from collections import OrderedDict

from django.contrib import admin

from models import Toys


class ToysModelAdmin(admin.ModelAdmin):

    # this is not perfect as you'll need to keep track of your
    # model changes also here, but you won't accidentally add
    # a field that is not supposed to be editable
    _add_fields = ('tags', 'price', 'status', )

    def get_form(self, request, obj=None, **kwargs):
        model_form = super(ToysModelAdmin, self).get_form(
            request, obj, **kwargs
        )

        if obj is None:
            model_form._meta.fields = self._add_fields
            model_form.base_fields = OrderedDict(**[
                (field, model_form.base_fields[field])
                for field in self._add_fields
            ])

        return model_form

【讨论】:

  • 你能给我举个例子吗?我用示例编辑了我的问题
  • 查看我的 EDIT 2,我对其进行了简要测试,希望对您有用。
  • 一个问题,它按字母排序字段名称我该如何解决?
  • 我不明白,你不想按字母顺序排列吗?这是一个OrderedDict,一旦在其中设置了键,就会设置字段的顺序。要更改该顺序,您可能需要重新定义model_form.base_fields。对于 mroe 复杂的解决方案,您将不得不提出另一个问题,因为它与这件事没有真正的关系。
  • 它按字母顺序对字段名称进行了排序,但我想保持它们平常的样子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2018-11-10
  • 2022-11-14
相关资源
最近更新 更多