【问题标题】:Get data from local database using Django and Ajax by passing arguments to urls returns 404 error使用 Django 和 Ajax 通过将参数传递给 url 从本地数据库获取数据返回 404 错误
【发布时间】:2017-12-01 07:56:26
【问题描述】:

我正在尝试使用 Django 和 Ajax 从本地数据库中获取数据。 我设置了一个视图,用户可以在其中获取数据并可以传递参数来过滤数据:开始日期、结束日期和站点 ID。 基本上我想将参数传递给views.py以过滤数据,但目前我并不关心参数是否反映在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 模式: ^管理员/

^get-data/

^get-sites/

^$

^静态/(?P.*)$

当前 URL,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/queries/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 应用程序,因此将不胜感激。

【问题讨论】:

  • 这里的核心问题是你把“项目应用”当作“项目中的应用”。您可以这样做,但这就是 URL 没有前缀的原因。 Django tutorial 很早就解释了这些组件。

标签: python json ajax django


【解决方案1】:

您尝试打开“/acoustic_viz/get-data/”,但在 urls.py 中所有 url 都没有 /acoustic_viz/ 前缀。尝试更改index.html模板文件中的url

$.getJSON('/get-data/')

或将acoustic_viz 添加到 urls.py 文件中的 url:

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 进行硬编码。您可以命名网址并使用url 标签。

【讨论】:

    【解决方案2】:

    我想你忘了用 $ 符号结束你的 url 模式

    你应该有这个

    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)
    

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

    干杯!

    【讨论】:

    • 我遇到了同样的错误,但我发现了我的问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2018-09-06
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多