我正在尝试使用Django和Ajax从我的本地数据库获取数据。 我设置了一个视图,用户可以在其中获取数据,并可以传入参数来过滤数据:开始日期,结束日期和站点ID。 基本上我想将参数传递给views.py以便过滤数据,但目前我并不关心params是否反映在url中,只要返回的json根据传递的参数进行过滤。 当我测试我是否可以成功从数据库中获取数据时,我发现找不到页面404错误: 找不到页(404) 请求方法:GET 请求网址:http://0.0.0.0:8000/acoustic_viz/get-data/?date_start=2016-10-28&date_end=2016-10-30&site_id=HENTONAOP
错误
使用acoustic_viz.urls中定义的URLconf,Django按以下顺序尝试了这些URL模式: ^管理员/
^获取数据/
^得到的网站/
^ $
^静态/(ΔP。*)$
当前网址acoustic_viz / get-data /与其中任何一个都不匹配。
是因为我传递的论据吗?如果是这样,我怎么能改变我的urls.py,以便Django能够找到带参数的url?
这是我的代码
acoustic_viz / index.html中
var dateStart = {key:'2016-10-28'};
var dateEnd = {key:'2016-10-30'};
var siteID = {key:'HENTONAOP'};
$("#test").on('click',function(){
console.log("test");
$.getJSON('/acoustic_viz/get-data/',
{date_start: dateStart.key, date_end:dateEnd.key, site_id: siteID.key })
// when the data comes back from the server
.done(function(data) {
console.log(data);
});
});
acoustic_viz / acoustic_viz / urls.py
from django.conf.urls import url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
import queries.views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^get-data/', queries.views.get_data),
url(r'^get-sites/', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
acoustic_viz /查询/ views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Data, Sites
import datetime
import json
class JSONResponse(HttpResponse):
"""
An HttpResponse that renders its content into JSON.
"""
def __init__(self, data, **kwargs):
content = json.dumps(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse, self).__init__(content, **kwargs)
class CSVResponse(HttpResponse):
"""
An HttpResponse that renders its contents as a CSV.
'rows' should be a list of dict objects, with each entry corresponding to 1 CSV field.
'fields' is the ordered list of field names in the CSV.
"""
def __init__(self, rows, fields, **kwargs):
csvfile = StringIO()
# Write header with field names
headerwriter = csv.writer(csvfile)
headerwriter.writerow(fields)
# Write CSV rows
writer = csv.DictWriter(csvfile, fields, extrasaction='ignore')
for row in rows:
writer.writerow(row)
kwargs['content_type'] = 'text/csv'
super(CSVResponse, self).__init__(csvfile.getvalue(), **kwargs)
self['Content-Disposition'] = 'attachment'
def errorResponse(errormessage, format, extraJSON={}):
"""
A nice standardized way to show the user an error message.
"""
if format == 'csv':
return CSVResponse(
[{'errormessage': errormessage}],
fields=('errormessage',) )
else:
json_objects = extraJSON.copy()
json_objects['error'] = True
json_objects['errormessage'] = errormessage
return JSONResponse(json_objects)
def hello_peeg(request):
return HttpResponse('hello peeg')
def get_sites(request):
sites = Sites.objects.all().order_by('int_id')
json_objects = [{'site': (s.site_id + ', ' + s.site_name)} for s in sites]
return JSONResponse({'sites': json_objects})
def get_data(request):
filtered = False
data = Data.objects.all().order_by('data_entry_id')
startDate = request.GET.get('date_start')
endDate = request.GET.get('date_end')
siteID = request.GET.get('site_id')
if startDate and endDate and siteID:
filtered = True
# __range: SELECT * WHERE date_recorded BETWEEN startDate and endDate;
data = Data.objects.filter(date_recorded__range=(startDate, endDate), site_id=siteID)
if not filtered: # error message if the user didn't supply an argument to filter the species list
json_objects = [{'data': (d.date_recorded+ ' ' + d.time_recorded+ ' ' + d.average)} for d in data]
#return errorResponse("Please supply a 'date_start', 'date_end', and 'site_id' argument.", format, {"data":[]})
else:
json_objects = [{'data': (d.data_entry_id + ' ' + d.site_id + ' ' + d.date_recorded+ ' ' + d.time_recorded+ ' ' + d.average)} for d in data]
return JSONResponse({'data': json_objects})
这是我第一次尝试编写Django应用程序,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
您尝试打开' / acoustic_viz / get-data /'但是在urls.py中,所有网址都没有/acoustic_viz/
前缀。尝试更改index.html
模板文件
$.getJSON('/get-data/')
或将acoustic_viz
添加到urls.py文件中的网址:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^acoustic_viz/get-data/', queries.views.get_data),
url(r'^acoustic_viz/get-sites/', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
另请注意,您不需要在django模板中对网址进行硬编码。您可以为网址命名并使用url标记。
答案 1 :(得分:0)
我认为您忘记使用 $ 符号
结束您的网址格式你应该有这个
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^get-data/$', queries.views.get_data),
url(r'^get-sites/$', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
而不是
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^get-data/', queries.views.get_data),
url(r'^get-sites/', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
如果您遇到任何错误,请告诉我,
干杯!