django admin:单独的只读视图和更改视图

Dan*_*sen 25 django django-admin

我想使用django admin生成一个对象的只读视图,其中包含一个"编辑"按钮,可以切换到同一对象的常见更改视图.

我知道如何使用readonly属性来生成只读视图,但我不知道如何生成两个视图,一个是只读的,一个是允许更改的.

我想尽可能多地重用管理界面,而不是从头开始编写视图.

请注意,此问题与权限无关:所有用户都有权更改对象.只是我希望他们不使用change_view,除非他们确实打算进行更改,降低意外更改或同时更改的风险.

Dan*_*sen 18

这是一个答案,字面上只用几行代码和几个模板更改来完成我的问题:

class MyModelAdmin(admin.ModelAdmin):
    fieldsets = [...]

    def get_readonly_fields(self, request, obj=None):
        if 'edit' not in request.GET:
            return <list all fields here>
        else:
            return self.readonly_fields
Run Code Online (Sandbox Code Playgroud)

现在,change_form的常用URL将生成只读的change_form,但如果您将"?edit = 1"附加到URL,则可以进行编辑.

还可以自定义change_form模板,具体取决于URL中是否有"?edit = 1".要做到这一点,把'django.core.context_processors.request'TEMPLATE_CONTEXT_PROCESSORSsettings.py,然后用request.GET.edit模板.

例如,要在不处于编辑模式时添加"编辑"按钮,请插入

  {% if not request.GET.edit %}                                                 
  <li><a href="?edit=1">Edit</a></li>                                           
  {% endif %} 
Run Code Online (Sandbox Code Playgroud)

只是之后<ul class="object-tools">change_form.html.

另一个例子,change_form.html改为包含

{% if save_on_top and request.GET.edit %}{% submit_row %}{% endif %}            
Run Code Online (Sandbox Code Playgroud)

将意味着提交行将仅以编辑模式显示.也可以使用此方法隐藏内联等上的删除按钮.

作为参考,这是我投入的settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (                                                 
    'django.contrib.auth.context_processors.auth',                              
    'django.core.context_processors.debug',                                     
    'django.core.context_processors.i18n',                                      
    'django.core.context_processors.media',                                     
    'django.contrib.messages.context_processors.messages',                      
    # Above here are the defaults.                                              
    'django.core.context_processors.request',                                   
)
Run Code Online (Sandbox Code Playgroud)