【问题标题】:Setting a field in django admin that is unchangeable在 django admin 中设置一个不可更改的字段
【发布时间】:2021-03-06 14:38:48
【问题描述】:

我目前正在开发一个供多个加油站使用的 Django 应用程序。我有一个车站模型,每个车站都有自己的对象。每个站都有自己的帐户,并且只能修改自己站的值。

我正在通过 Django 管理员提交报告,但我想将“站”字段设置为他们的站名,他们无法查看其他站名,也无法将选择更改为其他站。在 admin.py 中,这就是我所拥有的(报告称为 Shipment),有问题的字段称为 station。

class ShipmentAdmin(admin.ModelAdmin):
    #readonly_fields = ['station'] <- I thought this would work but it removes the value I set if user = manager
   
    def get_form(self, request, obj=None, **kwargs):
        form = super(ShipmentAdmin, self).get_form(request, obj, **kwargs)
        if str(request.user) == 'manager':
            form.base_fields['station'].initial = 'Texaco'
        else:
            form.base_fields['station'].initial = 'Exxon'

如果你们知道如何解决这个问题,请告诉我。基本上,如果用户是经理,则将站值设置为“Texaco”,否则将其设置为“Exxon”,并且不允许更改该字段。谢谢!

【问题讨论】:

  • 你能把这个逻辑移到 ShipmentAdmin init 方法吗?
  • @user1464664 我不确定该怎么做?

标签: python django django-admin admin


【解决方案1】:

如果字段有保存在 db 中的值,初始值将始终被覆盖。

一种方法是动态呈现只读字段:

class ShipmentAdmin(admin.ModelAdmin):
    exclude = ('station',) # exclude original station field

    def get_readonly_fields(self, request, obj=None):
        if str(request.user) == 'manager':
            return self.readonly_fields + ('station_value_for_manager',)
        else:
            return self.readonly_fields + ('station_value_for_everyone_else',)

    def station_value_for_manager(self, instance):
        return 'Texaco'
    station_value_for_manager.short_description = 'Station'

    def station_value_for_everyone_else(self, instance):
        return "Exxon"
    station_value_for_everyone_else.short_description = 'Station'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2020-01-22
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多