Django admin:如何格式化只读字段?

2024-03-06

我有一个模型,Director有两个 DateFields 和两个子类(代码如下)。我正在尝试为每个主管创建一个管理页面,其中显示相应的子类实例,而不是Director实例;这部分很简单(我为每个子类创建一个内联,给主 ModelAdmin 一个排除所有字段的表单,并且让主 ModelAdmin 仅从具有相应实例的内联请求表单集 - 代码;有一个未解决的问题使用这种方法,我在下面指出,但不是这个问题的重点)。

我遇到的问题是我想修改向用户显示的值,其中之一显示在只读字段中,其中之一则没有。处理是我想改变一个magic值(date(1,1,1)) 到字符串"On incorporation".

只读字段中的日期不会以非常易于解析的格式呈现,并且我希望减少对 javascript 的不必要依赖,因此我非常喜欢服务器端解决方案。

下面的代码显示了我想要的表单,除了日期值根本没有被修改,并且在保存时,有一个虚假的“请更正下面的错误”消息,即使没有错误,并且所有字段都被保存正确。

我的问题是:如何拦截要在页面上呈现的值(在只读字段和表单字段中),并更改它们以显示我选择的字符串?

模型(就材料而言):

class Director(models.Model, Specializable):
    date_of_appointment = models.DateField()
    date_ceased_to_act = models.DateField(blank=True,null=True)

class DirectorsIndividual(Director):
     pass

class DirectorsCorporate(Director):
     pass

管理代码:

class DirectorAdmin(EnhancedAdmin):

    fields = ()

##    def formfield_for_dbfield(self, db_field, **kwargs):
##        return None

    def queryset(self, request):
        """ Directors for all companies which are incorporated by the current user's organisation """
        individual = Individual.for_user(request.user)
        return Director.objects.filter(company__incorporation_ticket__ordered_by__in = Organisation.all_organisations_for_which_individual_authorised_to_incorporate(individual))

    class form(forms.ModelForm):
        # have this return no html - that way only inlines are shown
        class Meta:
            fields = ()
            pass

        def is_valid(self):
            self._errors = {}
            return True

    class DirectorsIndividualInline(admin.StackedInline):
        model = DirectorsIndividual
        fk_name = 'director_ptr'
        extra = 0
        readonly_fields = ('deferred_on','company','date_of_appointment',)
        can_delete = False

        def get_readonly_fields(self, request, obj=None):
            if obj and obj.company and not obj.company.is_submitted(): return self.readonly_fields # allow editing of fields listed in else
            else:
                return itertools.chain(self.readonly_fields, ('individual', 'is_secretary'))

        def has_delete_permission(self, request, obj=None):
            return obj and ((obj.company and not obj.company.is_submitted()) or not obj.company)

        class form(forms.ModelForm):
            def __init__(self, *args, **kwargs):
                super(forms.ModelForm, self).__init__(*args, **kwargs)
                self.fields['surrogate_for'].required = False
                self.fields['representative_for'].required = False
                if self.instance:
                    obj = self.instance
                    for field in (f for f in type(obj)._meta.fields if type(f) == fields.DateField):
                        val = field.value_from_object(obj)
                        assert (type(val) in (datetime.date, type(None),))
                        # assert field.name != 'date_of_appointment'
                        if val == inc_consts.EARLIEST_DATE:
                            self.initial[field.name] = "On incorporation"

            def is_valid(self):
                self._errors = {}
                return True

    class DirectorsCorporateInline(admin.StackedInline):

        model = DirectorsCorporate
        fk_name = 'director_ptr'
        extra = 0
        can_delete = False

        class form(forms.ModelForm):
            def __init__(self, *args, **kwargs):
                super(forms.ModelForm, self).__init__(*args, **kwargs)
                if True:
                    for k in self.fields:
                        self.fields[k].required = False

            def is_valid(self):
                self._errors = {}
                return True


    inlines = (DirectorsIndividualInline,DirectorsCorporateInline)

    def get_inlines(self, request, obj=None):
        return (inline for inline in (self.inline_instances)
                if inline.model.objects.filter(**{(inline.fk_name or self.model._meta.object_name.lower()) : obj }))

    def get_formsets(self, request, obj=None):
        """ only return formset for inlines for which there exists an object """
        return (inline.get_formset(request, obj) for inline in self.get_inlines(request, obj))

我意识到两者之间存在不对称性DirectorsCorporateInline and DirectorsIndividualInline;那是因为我正在使用一个实例进行测试DirectorsIndividual实例。上面的代码引用了模型中未显示的模型字段,因为它们对日期问题并不重要;应该可以在不改变这些字段的情况下使它们对于虚假错误问题变得无关紧要(尽管我意识到这对这个问题没有多大帮助,但我想让这个问题主要集中在一个问题上)。EnhancedAdmin is a ModelAdmin子类进行了一些小改动,这些改动不应该产生任何后果。可以根据合理的请求显示额外的代码,但我不想与不相关的代码混淆。

为了完整起见:我在 python 2.7.2 上使用 django 1.3.1。


最简单的方法是通过在ModelAdmin。假设该字段名为my_datetime:

from django.contrib import admin
from django.utils.formats import localize


class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ('my_datetime_localized',)

    def my_datetime_localized(self, obj):
        return localize(obj.my_datetime)
    my_datetime_localized.short_description = 'Date / time'

注意:如果settings.USE_L10N is True,这将显示查看器本地时间的日期时间,这可能就是您想要的。如果你想保留USE_L10N as False那么你可以像这样重写它的行为:return localize(obj.my_datetime, use_l10n=True).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django admin:如何格式化只读字段? 的相关文章

随机推荐

  • 如何在 Windows 10 UWP 中根据 HTML 内容调整 Webview 高度?

    我目前正在开发 Windows 10 UWP 应用程序 并面临 WebView 的问题 即当我的 HTML 内容较少时 我的 JavaScript 高度会增加 我的代码如下 WebView webView new WebView IsHit
  • Django 模型中的密码字段

    我正在尝试创建一个可以存储其他应用程序的用户名和密码的模型 如何在 Django 中设置密码字段 使其在管理中不是纯文本 提前致谢 作为 mlissner建议 https stackoverflow com questions 371510
  • 如何使用 angular2 应用程序和 net core 应用程序实现 X-XSRF-TOKEN?

    我在 Startup cs 中设置了我的网络核心应用程序和防伪 middlweare services AddAntiforgery options gt options HeaderName X XSRF TOKEN 在Configure
  • onClick 不适用于 IE 11 中的单击

    当用户单击视频上的任意位置时 我尝试播放 暂停视频 问题是 它在 IE 11 中双击运行 而对于所有其他浏览器 它在单击左键时运行良好 以下是我的代码 var obj
  • 将键值数据库与 Spark 集成

    我无法理解 Spark 如何与存储交互 我想创建一个从 RocksDB 数据库 或任何其他键值存储 获取数据的 Spark 集群 然而 此时此刻 我能做的最好的事情就是将整个数据集从数据库获取到每个集群节点的内存中 例如映射到映射中 并从该
  • 优化填充“?”的正则表达式

    速记键盘上有以下按键STKPWHRAO EUFRPBLGTSDZ 用户按下多个键 然后抬起时一次性注册所有键 这类似于在钢琴上弹奏和弦 示例笔画是KAT TPHOEUGT 我有一个正则表达式来测试有效的速记和弦 可以是任意数量的这些键 但它
  • 防止选择日期范围内包含无效日期的日期范围

    我正在使用日期范围选择器来选择日期范围 一旦范围之间存在无效日期 就不应该将它们转移到另一个日期 类似的东西这个问题 https stackoverflow com a 46059134 8093805 但是它使用 Bootstrap da
  • 格式化 JavaScript 标签的正确方法是什么?

    自 1996 年以来一直在开发网络应用程序 我经常找到做旧事情的新方法 所以我想知道在新开发中使用正确的 JavaScript 标签是什么 目前我对 XHTML 使用类似的东西 我在某处读到这可能会导致旧版浏览器出现问题 但要使用以下内容
  • java.net.SocketTimeoutException:超时

    With OkHttp图书馆 应用程序面临以下SocketTimeoutException问题 如果请求大小较小 则可以正常工作 小于 1MB 我在 10 秒内收到此异常 甚至我的套接字超时 readTimeout 价值要高得多 请求始终失
  • React Native 导航 5 身份验证流程

    我似乎无法在我的 App js 文件上进行三元身份验证 我正在检查是否有密钥 然后根据该密钥的存在显示 AuthStack 或 MainStack 当我从 AuthStack 转到 MainStack 将密钥设置为 AsyncStorage
  • Toolbar.inflateMenu 似乎什么也没做

    我目前正在研究新的 AppCompat 库 将材料设计带入旧设备 将工具栏设置为操作栏对我来说效果很好 但工具栏似乎在调用时没有执行任何操作inflateMenu int resId 从文档中 我认为这是替换getMenuInflater
  • c#: google Drive : google apis.services 您是否缺少程序集或引用

    我正在尝试使用快速入门示例将 google drive 用于 net 我已经通过 nuget 安装了 dll 但收到以下错误 指出我缺少 google apis service 的引用或程序集 任何帮助 将不胜感激 using System
  • 有没有一种简单的方法可以从流星部署的应用程序导出数据?

    有没有一种简单的方法可以从流星部署的应用程序导出数据 因此 例如 如果我部署了一个名为 test meteor com 的应用程序 我如何轻松下载该应用程序收集的数据 以便我可以使用已部署应用程序中的数据在本地运行它 要获取您在meteor
  • 查询缓存效率

    我正在使用 MySQLTuner pl 来优化我的网站 尽管我不完全确定如何解决其中一些问题 并且想知道是否有人可以帮助我 我运行 16GB RAM MySQL 设置如下 key buffer 1024M max allowed packe
  • C# 按值复制数组

    我有一个类型数组MyType types 我想制作这个数组的独立副本 我试过这个 MyType types2 new MyType types Length types2 types 但这会创建对第一个的引用 然后我尝试了 Array Co
  • 在 QTextEdit 中激活光标

    我无法找到一种方法来激活 QTextEdit 内的光标 而无需在实际的小部件内单击 我想要做的是 在 QTextEdit 窗口中键入一些内容 单击 QPushButton 并使光标在 QTextEdit 中保持活动状态 而无需再次单击窗口
  • 如何在 Xcode 4.0 中使用编译源?

    在 Xcode 3 0 中 您可以使用 组和文件 面板中的 项目目标 来删除不需要的依赖文件 以下是说明 单击 目标 旁边的箭头 直到在 组和文件 面板中将其展开 单击 xauth 旁边的箭头 单击编译源 删除以下 YAJL 依赖文件 在
  • 引导标准错误位于引导类中的什么位置?

    考虑以下引导程序 library MASS library boot c set seed 1 boot fn function data index mean data index output boot Boston medv boot
  • 如何用 South 重命名外键字段?

    重命名一个简单的 charfield 等似乎很容易 Django 如何使用 South 重命名模型字段 https stackoverflow com questions 3235995 django how to rename a mod
  • Django admin:如何格式化只读字段?

    我有一个模型 Director有两个 DateFields 和两个子类 代码如下 我正在尝试为每个主管创建一个管理页面 其中显示相应的子类实例 而不是Director实例 这部分很简单 我为每个子类创建一个内联 给主 ModelAdmin