2010-06-18 96 views
19

是否可以授予用戶查看權限,但不能更改或刪除。權限查看,但不能更改! - Django

目前在我看到的唯一權限是「添加」,「更改」和「刪除」...但在那裏沒有「讀取/查看」。

我真的需要一些用戶將只能諮詢管理面板,爲了看看已被添加。

回答

14

在admin.py

# Main reusable Admin class for only viewing 
class ViewAdmin(admin.ModelAdmin): 

    """ 
    Custom made change_form template just for viewing purposes 
    You need to copy this from /django/contrib/admin/templates/admin/change_form.html 
    And then put that in your template folder that is specified in the 
    settings.TEMPLATE_DIR 
    """ 
    change_form_template = 'view_form.html' 

    # Remove the delete Admin Action for this Model 
    actions = None 

    def has_add_permission(self, request): 
     return False 

    def has_delete_permission(self, request, obj=None): 
     return False 

    def save_model(self, request, obj, form, change): 
     #Return nothing to make sure user can't update any data 
     pass 

# Example usage: 
class SomeAdmin(ViewAdmin): 
    # put your admin stuff here 
    # or use pass 

在change_form.html替換此:

{{ adminform.form.non_field_errors }} 

與此:

<table> 
{% for field in adminform.form %} 
    <tr> 
     <td>{{ field.label_tag }}:</td><td>{{ field.value }}</td> 
    </tr> 
{% endfor %} 
</table> 

然後通過刪除該行刪除提交按鈕:

{% submit_row %} 
+0

我跟着這個答案,它刪除添加和刪除按鈕,但沒有更改按鈕。當我試圖以相同的方式刪除更改按鈕(通過返回false),它根本不顯示模型! – Marjan 2012-08-31 10:59:04

+0

你必須自己刪除鏈接(例如使用jQuery)。 'save_model'方法不返回任何內容,所以用戶不能保存。所以即使他們偶然發現了這個鏈接,他們也不會有任何傷害。或者,也許我不明白你的問題。 – 2012-08-31 22:13:34

+2

這很好,但Django文檔說save_model應該保存或刪除數據,它不應該用於否決目的。 https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#modeladmin-methods – 2014-02-23 17:58:11

3

你不能只是查看Django管理的事情。

這裏有一個databrowse應用程序。

+0

鏈接斷開。 – 2014-02-23 18:26:20

+3

@Ryu_hayabusa它被棄用,請參閱http://stackoverflow.com/questions/17961791/as-django-databrowse-is-deprecated-in-django-1-4-is-there-a-better-way-for-數據 – 2014-02-24 19:33:30

+0

鏈接無法訪問 – 2017-10-25 10:08:08

3

一種解決方法是在模型上增加一個「保存」權限,如果用戶具有此權限,則檢查modeladmin的save_model方法,如果他沒有,那意味着他可以在此模式中執行所有操作保存編輯的數據!

+0

這是一個了不起的想法!謝謝!我想我可能會接受這個答案:) – RadiantHex 2010-06-18 11:49:33

2

您可以通過以下方式做到這一點:

1)可以使字段只讀如果該對象已created.But這樣沒有人可以更改的字段

2)你可以使用databrowse

3)您可以使用表單驗證,如果用戶如果有域改變

4是不是在選擇列表拋出驗證錯誤),你可以創建一個視圖,如果用戶是在列表中,然後將其重定向到正常流程或重定向他到簡單的html只讀頁面

5)使用jquery使字段只讀是用戶不在列表中,並覆蓋保存方法來檢查任何智能。在你的保存方法拋出錯誤任何形式已經改變,用戶不在您的list.username = request.user.username

0

您也可以重寫ModelAdmin.change_view(如Django文檔中所述)。只要確保你也覆蓋save_model以確保用戶無法更新數據

3

向上面提到的Bernhard Vallant提供樣品。在我的admin.py文件,我將放在

class LogBookAdmin(admin.ModelAdmin): 
    list_display  = ['dateEntry','due_date', 'controlNo', 'carrier', 'status']  
    exclude    = ['encoder_status', 'engr_status', 'chief_status', 'ischecked'] 

    def save_model(self, request, obj, form, change):  
     if request.user.groups.filter(name='Encoder').exists(): 
      pass 
     else: 
      return super(LogBookAdmin, self).save_model(request, obj, form, change) 

假設我有一組名稱Encoder,我想他們只能查看日誌。但其他組名可以保存任何更改。

0

重複:https://stackoverflow.com/a/33543817/101831

見​​

class ReadOnlyAdminMixin(object): 
    """Disables all editing capabilities.""" 
    change_form_template = "admin/view.html" 

    def __init__(self, *args, **kwargs): 
     super(ReadOnlyAdminMixin, self).__init__(*args, **kwargs) 
     self.readonly_fields = self.model._meta.get_all_field_names() 

    def get_actions(self, request): 
     actions = super(ReadOnlyAdminMixin, self).get_actions(request) 
     del actions["delete_selected"] 
     return actions 

    def has_add_permission(self, request): 
     return False 

    def has_delete_permission(self, request, obj=None): 
     return False 

    def save_model(self, request, obj, form, change): 
     pass 

    def delete_model(self, request, obj): 
     pass 

    def save_related(self, request, form, formsets, change): 
     pass 

模板/管理/ view.html

{% extends "admin/change_form.html" %} 
{% load i18n %} 

{% block submit_buttons_bottom %} 
    <div class="submit-row"> 
    <a href="../">{% blocktrans %}Back to list{% endblocktrans %}</a> 
    </div> 
{% endblock %} 

模板/管理/ view.html(用於格拉佩利)

{% extends "admin/change_form.html" %} 
{% load i18n %} 

{% block submit_buttons_bottom %} 
    <footer class="grp-module grp-submit-row grp-fixed-footer"> 
    <header style="display:none"><h1>{% trans "submit options"|capfirst context "heading" %}</h1></header> 
    <ul> 
     <li><a href="../" class="grp-button grp-default">{% blocktrans %}Back to list{% endblocktrans %}</a></li> 
    </ul> 
    </footer> 
{% endblock %} 
0

我有一個解決方法,需要犧牲更改只有權限。在管理模板change_form.html中,我同時檢查添加更改模板中的權限,並且僅在用戶同時具有權限時才顯示submit_row。因此,具有更改權限的用戶只能查看change_list和change_form,但從不會看到按鈕提交他們所做的更改。

的變化我做:

  • 創建我的應用程序目錄模板像目錄
  • myapp/templates/admin/myapp/

  • change_form.html目錄替換

    {% block submit_buttons_bottom %}{% submit_row %}{% endblock %}

{# Use change permission only as read only #} 
{% if has_change_permission and has_add_permission %} 
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} 
{% endif %} 

這是遠遠乾淨,還允許用戶如果除了標準的管理形式等方面都提供了更改的數據,但也許它不夠的,如果你只是想保護員工意外更改他們不應該的數據。