如何在 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 放在他们的之上。
我使用 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 放在他们的之上。