【问题标题】:Django REST Browsable API Template ChangeDjango REST 可浏览 API 模板更改
【发布时间】:2018-12-25 21:33:24
【问题描述】:

我想自定义 Django REST Framework Browsable API 模板(只需将品牌更改为不同的名称和链接)。

我已阅读有关如何实现此目的的文档,并最初在以下路径中执行了以下操作:hints(project)->hints1(app)->templates->rest_framework->api.html

api.html:

{% extends "rest_framework/base.html" %}


{% block title %} Handy Dev Hints - API {% endblock %}

    {% block branding %}
    <span>
        <a class='navbar-brand' rel="nofollow" href="{% url 'html' %}">
             -----HTML View----- <span class="version">1</span>
         </a>
    </span>
    {% endblock %}

我还修改了我的 settings.py 如下,特别是 DIRS 部分:

settings.py:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [BASE_DIR, os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

从我看过的教程和我阅读的文档来看,这应该足以实现更改。但是,它没有用。

所以我决定直接在站点包库中更改 base.html。

base.html:

<!DOCTYPE html>
.
. 
.
{% block body %}
  <body class="{% block bodyclass %}{% endblock %}">

<div class="wrapper">
  {% block navbar %}
    <div class="navbar navbar-static-top {% block bootstrap_navbar_variant %}navbar-inverse{% endblock %}"
         role="navigation" aria-label="{% trans "navbar" %}">
      <div class="container">
        <span>
          {% block branding %}
            <a class='navbar-brand' rel="nofollow" href="{% url 'html' %}">
              -----HTML View-----
            </a>
          {% endblock %}

当我在本地服务器上运行此解决方案时,它有效。但是,当我将文件上传到外部服务器时它不起作用(我也将rest_frameworkrest_framework_jwt 站点包上传到外部服务器,但我认为我仍然缺少一些东西)。

关于如何按照文档的建议使更改在外部服务器上运行有什么建议吗?甚至通过 base.html 更改方法? (或任何其他方法)。

非常感谢!

【问题讨论】:

    标签: html django django-templates django-rest-framework


    【解决方案1】:

    有几件事可能是您遇到此问题的原因:

    1) 首先您似乎在您的应用程序文件夹中创建了您的 api.htm 文件,而您在项目目录级别引用您的模板文件夹含义
    [您的应用模板引用] 项目目录 --> 应用 --> 模板 --> api.html
    [django 模板查找] Proj dir --> 模板 --> api.html 导致错误

    2) 其次作为替代解决方案,您选择破解站点包安装(非常糟糕!不推荐)虽然这可以在本地工作,但当您在外部服务器上部署应用程序时, DRF 被重新安装在外部服务器中(这不会有任何修改)

    推荐的做法是:

    1) 将您的 api.htm 移动到项目级文件夹。即项目目录 --> 模板 --> api.html

    {% extends "rest_framework/base.html" %}
       {% block title %} Handy Dev Hints - API {% endblock %}
         {% block branding %}
           <span>
            <a class='navbar-brand' rel="nofollow" href="{% url 'html' %}">
             -----HTML View----- <span class="version">1</span>
            </a>
           </span>
    {% endblock %}
    

    让 django 轻松找到
    OR
    2) 您将 os.path.join('BASE_DIR','YOUR_APP_DIR', 'templates') 添加到设置中的模板目录,即

        TEMPLATES = [
    {
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, os.path.join(BASE_DIR, 'YOUR_APP_DIR', 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
    ]
    

    更新:

    如果我可以补充一下,只要所有内容都放在适当的路径中以便框架可以找到,按照关于如何自定义它的教程就可以工作,这里是一个缺少我所做的自定义的屏幕。

    【讨论】:

    • 感谢您的回答并澄清为什么站点包黑客不起作用! (这是最后的手段)。
    • 欢迎您@SteveKerr,希望您能够自定义您的应用程序。如果您需要帮助,请告诉我以防万一。
    • @Virtu_Acad,为什么需要用应用模板路径填充 DIRS 属性?这不是 APP_DIRS =True 的用途吗?它会在 app/templates 目录中为每个现有应用查找模板
    • @MichaelR 您需要填写 DIRS,因为此路径中的模板通常(但不限于)您创建的模板,因此即使在部署时,任何修改都将在应用程序生命周期内持续存在,而 APP_DIR在模板目录中搜索已安装的应用程序,该应用程序将始终在部署时进行修改,从而覆盖您可能对其进行的任何更改,因此它是非常糟糕且不建议破解它的原因。
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 2020-07-15
    • 1970-01-01
    • 2016-06-06
    • 2015-04-28
    • 2016-03-24
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多