如何在 django adminlte 中添加自定义视图?

How to add custom view in django adminlte?

我使用 pycharm 创建了一个环境并通过 git 从 https://github.com/app-generator/django-dashboard-adminlte.git 克隆安装了 adminlte。并安装了 adminlte3 、 django3.1 和所有要求。然后 运行 python manage.py 运行server 并注册了一个新用户并且能够登录,查看所有页面,添加新 link 到 html 页面。但是我无法将带有 jsonresponse 的视图添加到单击新页面上的按钮,得到 Error 500 - Server Error.

我的新 html 页面是

{% extends "layouts/base.html" %}
{% block title %} Layout Boxed {% endblock %} 
<!-- Element injected in the BODY element -->
{% block body_class %} sidebar-mini layout-boxed {% endblock body_class %} 
<!-- Specific Page CSS goes HERE  -->
{% block stylesheets %}
  <!-- Google Font: Source Sans Pro -->
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="/static/assets/plugins/fontawesome-free/css/all.min.css">
  <!-- Theme style -->
  <link rel="stylesheet" href="/static/assets/css/adminlte.min.css">
  <link rel="stylesheet" href="/static/assets/css/mapstyle.css">
  <link rel="stylesheet" href="/static/assets/js/pages/gis/dist/map.css">
<style>
   .map {
        margin: 0;
        padding: 0;
        width: 900px;
        height: 500px;
        background:white !important;
    border:1px solid #ccc;
      }
</style>
{% endblock stylesheets %}
{% block content %}
  <div class="content-wrapper">
    <div id="lyrDiv"></div>
    <div id="map" class="map"></div>
    <button id="search">Search</button>
  </div>
{% endblock content %}
<!-- Specific Page JS goes HERE  -->
{% block javascripts %}
  <!-- jQuery -->
  <script src="/static/assets/plugins/jquery/jquery.min.js"></script>
  <!-- Bootstrap 4 -->
  <script src="/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
  <!-- AdminLTE App -->
  <script src="/static/assets/js/adminlte.min.js"></script>
  <!-- AdminLTE for demo purposes -->
  <script src="/static/assets/js/demo.js"></script>
  <script src="/static/assets/js/pages/map.js"></script>
  <script src="/static/assets/js/pages/search.js"></script>
{% endblock javascripts %}

search.js

$( "#search" ).click(function() {
    $.get('/search/',{'csrfmiddlewaretoken':csrftoken},function(data){
        alert(data); // here getting Error 500 - Server Error
    });
});

我在 /django-dashboard-adminlte/app/urls.py

中添加了下面一行
re_path(r'^search/$', search.spatial_srch, name='search'), 

和search.py

from app.models import *
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

@csrf_exempt
def spatial_srch(request):
    data= Demotable.objects.all() 
    searchArr = []
    output = {}

    for c in data:
        searchArr.append({'type': 'Feature', 'properties': {'id':c.id,'name': str(c.name)},'geometry': {'type': 'Point', 'coordinates': [c.the_geom.x, c.the_geom.y]}})
    output = {'type': 'FeatureCollection', 'features': searchArr}
    return JsonResponse(output)

当我点击 'Serach' 按钮时,请求不会进入视图 search.py 我的代码有什么问题?我错过了什么配置?

post显示

错误 500 仅显示管理错误页面。而已

问题出在他们 generate the error 的(不太好)方式上。那里是 anti-pattern 地狱,但简而言之,这意味着其中有一个例外:

  • 正在寻找模板
  • 正在加载模板
  • 或渲染模板

他们抓住了它,不让你看到发生了什么。代码不是很好,您必须修改该文件才能开始调试它:

@login_required(login_url="/login/")
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:
        
        load_template = request.path.split('/')[-1]
        html_template = loader.get_template( load_template )
        return HttpResponse(html_template.render(context, request))
        
    except template.TemplateDoesNotExist:

        html_template = loader.get_template( 'page-404.html' )
        return HttpResponse(html_template.render(context, request))

    # Remove or comment these lines:
    #except:
    #
    #   html_template = loader.get_template( 'page-500.html' )
    #    return HttpResponse(html_template.render(context, request))

另外我不确定这是产生错误的具体位置,他们可能在其他地方做类似的事情。

编辑

这个很....不专业的代码:

    # Matches any html file
    re_path(r'^.*\.*', views.pages, name='pages'),

不,它不匹配任何“html”文件 - 它匹配所有内容,因为它们没有得到正则表达式:

^ - start of string
.* - anything or nothing
\.* - >>>zero<<< or more dots

结果:\.* 被忽略,因为它无关紧要,所以它匹配所有内容,如果你将 re_path 放在它下面,它永远不会被查询,因为 Django 使用先匹配后赢的方法。

所以你的 url 匹配他们的,然后将其路由到页面视图:

load_template = request.path.split('/')[-1]

因为 request.path 是 '/search/''/search/'.split('/')[-1] 给出了空字符串,这就造成了你的问题。

我强烈建议修复他们的 url 路径:

    # Matches any html file
    re_path(r'\.html$', views.pages, name='pages'),

或者把你的 re_path 放在他们的之上。