通过将参数传递给urls返回404错误,使用Django和Ajax从本地数据库获取数据

时间:2017-06-28 05:23:23

标签: python json ajax django

我正在尝试使用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应用程序,所以任何帮助都会受到赞赏。

2 个答案:

答案 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)

如果您遇到任何错误,请告诉我,

干杯!