在Django admin中设置不可更改的字段

2024-09-29 19:31:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在制作一份通过Django admin提交的报告,但我想将“station”字段设置为他们的站点名称,这样他们就不能查看其他站点名称,也不能将选择更改为其他站点。在admin.py中,这就是我所拥有的(报告称为Shipping),所涉及的字段称为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'

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


Tags: djangoselfform名称fieldsgetifadmin
1条回答
网友
1楼 · 发布于 2024-09-29 19:31:28

如果字段的值保存为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'

相关问题 更多 >

    热门问题