簡體   English   中英

根據更改權限更新 django 中的 readonly_fields

[英]updating the readonly_fields in django based on the change permission

我有 python django 項目,我用於顯示所有書籍並在單擊每本書時呈現一本書,因此 django 將自動生成書籍詳細信息。

因此,在渲染時,我想讓 price_upgrade boolean 字段只讀,前提是用戶沒有名為 author 的組

所以我的代碼是這樣的

class BookAdmin(admin.ModelAdmin):
    list_per_page = 10
    list_display_links = ['name']
    readonly_fields = ('id', 'name', 'city', 'price_upgrade')
    ...
    ...
    ...

def has_change_permission(self, request, obj=None):
        if request.user.groups.all().filter(Group ='author').exists():
            print('author group is there')
        else:
            print('author group is not there')
        #print('request', request.user.groups.all(), type(request.user.groups.all()))
        return True

如果當前用戶沒有作者組,我如何將 price_upgrade 字段添加到 readonly_fields 否則我們應該從 readonly_fields 中刪除 price_upgrade 字段,因為他是作者組的一部分,因此他可以編輯它

版本 python 2.7 django 1.8

任何幫助表示贊賞

您可以在 BookAdmin 中像這樣覆蓋 changeform_view

       def changeform_view(self, request, *args, **kwargs):
            self.readonly_fields = list(self.readonly_fields)
            usergroup = request.user.groups.filter(name__in=['author']).exists()
            if not usergroup:
                self.readonly_fields.append('price_upgrade')

            return super(BookAdmin, self).changeform_view(request, *args, **kwargs)

另一個選項:更新后您可以覆蓋管理員中的 get_readonly_fields 方法

def get_readonly_fields(self, request, obj=None):
    usergroup = request.user.groups.filter(name__in=['author']).exists()
    if not usergroup:
       # since readonly_fields is a tuple we need to append to tuple
        self.readonly_fields = self.readonly_fields + ('price_upgrade',)
    return self.readonly_fields

它基於注釋覆蓋值的問題是因為它在同一個端口(同一個實例)上運行,所以使項目在兩個不同的端口上啟動並運行,所以問題不存在。 由於當您訪問同一個端口時,這兩個用戶將擁有相同的權限,因此我們需要重新啟動服務器。

這是我發現的,如果有任何遺漏信息,請更新

@更新有一個緩存問題,這就是為什么它會覆蓋權限,需要找到解決方案,問題是如果您使用其他用戶登錄沒有作者組並且注銷並使用用戶登錄作者組將無法編輯該復選框,因此存在緩存問題一旦我找到解決方案將很快更新它。 如果我重新啟動服務器它工作正常,但重新啟動服務器不是正確的解決方案。

相關參考

所以在經歷了這個問題之后,找到了解決方案

def get_readonly_fields(self, request, obj=None):
        readOnlyFields = super(BookAdmin, self).get_readonly_fields(request, obj)
        usergroup = request.user.groups.filter(name__icontains='author').exists()
        if not usergroup:
            readOnlyFields = readOnlyFields + ('price_upgrade',)
        return readOnlyFields

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM