首页 > 解决方案 > Django:如何制作编辑 JSON 文件而不是模型的自定义管理视图?

问题描述

我的目标是向我的管理页面添加一个额外的视图来编辑 json 文件,而不是我的数据库。文档说可以通过覆盖我的自定义类中的方法来添加自定义get_urls()视图AdminSite。它接着说:

您呈现的任何使用管理模板或扩展基本管理模板的视图都应request.current_app在呈现模板之前设置。如果self.name您的视图位于 a 上,AdminSite或者self.admin_site.name您的视图位于ModelAdmin.

正如您在此处看到的,我尝试这样做(参见json_admin_view()方法的第一行):

import json

from django.contrib.admin import AdminSite
from django.urls import path
from django.shortcuts import render

from .forms import JsonForm

JSON_FILE = 'json_app/data.json'

class MyAdminSite(AdminSite):
    site_header = "JSON App Administration"

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('json_admin/',
                 self.admin_view(self.json_admin_view),
                 name='json_admin')
        ]
        return my_urls + urls

    def json_admin_view(self, request):
        request.current_app = self.name  # This doesn't seem to do anything

        context = {}

        with open(JSON_FILE, 'r') as read_data:
            json_data = json.load(read_data)

        if request.method == 'POST':
            form = JsonForm(request.POST)
            if form.is_valid():
                with open(JSON_FILE, 'w') as write_data:
                    json.dump(form.cleaned_data, write_data)
                    context.update({'form_saved': True})

        else:
            form = JsonForm({
                'fname': json_data['fname'],
                'lname': json_data['lname'],
            })

        context.update({'form': form})

        return render(request, 'json_app/admin/json_admin.html', context)

我可以访问/admin/json_admin/,它工作正常,除了标题显示“Django Administration”而不是“JSON App Administration”,即使json_admin.htmlextends admin/base_site.html。另外,我想在管理索引页面上显示一个指向视图的链接,就好像它是一个普通的模态更改表单一样。所以我有两个问题:

  1. 为什么我在自定义管理页面的标题上没有看到“JSON 应用程序管理”?我认为request.current_app = self.name是为了帮助解决这个问题,但也许我使用不正确。
  2. 如何从管理索引添加指向自定义管理页面的链接?如果它是我可以使用的模型register(),但我不能这样做,因为它不是模型。

如果您知道从管理页面编辑 json 文件的更好方法,我也很乐意听到。

标签: djangodjango-viewsdjango-templatesdjango-admin

解决方案


推荐阅读