2017-04-18 63 views
-1

我在一家公司实习,我需要使用谁在2012年编程它的另一个学员的程序,所以我做了一些更新,但我有一些问题:XHR无法与Django项目加载

当我按下一个按钮,我有一个JS,使​​恢复JSON。但我有我的Firefox控制台上的消息:

Object { message: "Unable to load /query/?typeForm=com…", stack:".cache["dojo/errors/create"]/</</[email protected]…", response: Object, status: 0,responseText: "", xhr: XMLHttpRequest } 

我的JS:

function queryDataGrid(map, stringForm) { 
var test = "pouet"; 
require(["dojox/grid/DataGrid", 
     "dojo/store/Memory", 
     "dojo/data/ObjectStore", 
     "dojo/_base/xhr", 
     "dojo/domReady!", 
     "dojo/dom", 
     "dojo/_base/array"], 
function(DataGrid, Memory, ObjectStore, xhr, arrayUtil, dom) { 
    var nodeDomGrid = dom.byId("datagrid"); 
    window.alert("hey"); 
    xhr.get({ 
     url: "/query/", 
     form: dom.byId(stringForm), 
     handleAs: "json", 
     load: function(data) { 
      var nodeDomGrid = dom.byId("datagrid"); 
      var nodeGrid = dijit.byId("datagrid"); 

      var gridLayout = []; 
      var dataStore = new ObjectStore({ objectStore:new Memory({ data: data.fields }) }); 
      console.log("store"); 
      console.log(data.fields[0][1]); 

      globalData = data; 

      for(i in data.columns) { 
       gridLayout.push({ 
        name: data.columns[i], 
        field: data.columns[i], 
        width: "auto" 
       }) 
      } 

      nodeGrid.setStructure(gridLayout); 
      nodeGrid.setStore(dataStore); 

      var nodeMap = dom.byId("map"); 

      columns = data.columns; 
      columnsToDisplay = [] 

      numberColumn = 0; 
      for (i in columns) { 
       if (columns[i] == "Distance Fin") { 
        numberColumn = i 
       } 
       if (parseInt(i) > parseInt(numberColumn) && numberColumn != 0) { 
        columnsToDisplay.push({ value: columns[i], label: columns[i]}); 
       } 
      } 
      dijit.byId("dataToColor").addOption(columnsToDisplay); 

      var vectorLayer = map.getLayersByName("KML")[0]; 
      vectorLayer.removeAllFeatures(); 
      var kmlFile = createKMLFile(data.kmldata, dom.byId("hiddenColor").value, dom.byId("sizeLine").value, dom.byId("colourPR").style.backgroundColor, dom.byId("sizePR").value); 
      var features = KMLToFeatures(kmlFile); 
      var bounds; 
      for(var i=0; i<features.length; ++i) { 
       if (!bounds) { 
        bounds = features[i].geometry.getBounds(); 
       } else { 
        bounds.extend(features[i].geometry.getBounds()); 
       } 

      } 
      vectorLayer.addFeatures(features); 
      console.log(vectorLayer); 

      map.zoomToExtent(bounds); 
      refreshLayer(vectorLayer); 

      if (stringForm == "commonQueriesForm" && dijit.byId("table").get("value") == "location") { 
       dom.byId("colourPalette").style.display = "block"; 
       dom.byId("styleKML").style.display = "none"; 
      } 
      else { 
       dom.byId("colourPalette").style.display = "none"; 
       dom.byId("styleKML").style.display = "block"; 
      } 
     }, 
     // Message d'erreur à modifier 
     error: function() { 
      nodeDomGrid.innerHTML = "La requête a engendré une erreur."; 
     } 
    }) 
}); 

console.log(stringForm); 
}; 

我的表格:

<form id="commonQueriesForm" data-dojo-type="dijit.form.Form" onload="alert('test')"> 
<p> 
<div id="commonDataTitlePane" data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Requêtes'"> 
    <input type="text" name="typeForm" id="typeForm" value="common" style="display:none" /> 
    <select name="table" id="table" class="cSelect" data-dojo-type="dijit/form/Select" 
    data-dojo-props="onChange:function(){ if (dijit.byId('table').get('value') == 'location') {dijit.byId('age').set('disabled', true); } else {dijit.byId('age').set('disabled', false); }}"> 
     {% for key, value in dictTablesDatabase.items %} 
      <option value="{{ key }}">{{ key }}</option> 
     {% endfor %} 
      <option value="location">Repérages</option> 
     </select><br /> 
     <select name="road" id="road" class="cSelect" data-dojo-type="dijit.form.Select" data-dojo-props=""> 
      <option value="all">Toutes les routes</option> 
       {% for road in listRoad %} 
      <option value="{{ road|first|cut:' ' }}">{{ road|first|cut:' ' }}</option> 
       {% endfor %} 
     </select><br /> 
     <select name="age" id="age" class="cSelect" data-dojo-type="dijit.form.Select" data-dojo-props=""> 
      {% for age in arrayNumber %} 
       <option value="{{ age }}">{{ age }}</option> 
      {% endfor %} 
     </select> 
</div> 
<button type="executeButton" data-dojo-type="dijit.form.Button" onClick="queryDataGrid(map, 'commonQueriesForm');">Lancer la requête</button> 
</p> 
</form> 

urls.py:

from django.conf.urls import include, url 
from GSRBaseWeb.Home import views as myapp_views 

# Uncomment the next two lines to enable the admin: 
# from django.contrib import admin 
# admin.autodiscover() 

urlpatterns = [ 
# Examples: 
# url(r'^$', 'GSRBaseWeb.views.home', name='home'), 
# url(r'^GSRBaseWeb/', include('GSRBaseWeb.foo.urls')), 

# Uncomment the admin/doc line below to enable admin documentation: 
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 

# Uncomment the next line to enable the admin: 
# url(r'^admin/', include(admin.site.urls)), 
url(r'^home/$',myapp_views.home, name='home'), 
url(r'^home/query', myapp_views.queryDataGrid, name='queryDataGrid'), 

] 

意见。 py:

# -*- coding: utf-8 -*- 
from django.shortcuts import render 
from django.http import HttpResponse 
from GSRBaseWeb.Utils.utils import Utils 
from GSRBaseWeb.DataAccess.databaseAccess import DatabaseAccess 
from GSRBaseWeb.DataAccess.GSRBaseDLLAccess import GSRBaseDLLAccess 
from ctypes import * 

# Envoie les données nécessaires aux différents formulaires 
def home(request): 
    dictToSend = {} 

    data = DatabaseAccess() 
    dictTablesDatabase = data.dataToDisplay() 
    dictToSend["dictTablesDatabase"] = dictTablesDatabase 

    # Sélection de l'ensemble des routes 
    queryRoads = "SELECT id_route, nom FROM routes" 
    listRoad = data.executeQuery(queryRoads) 
    dictToSend["listRoad"] = listRoad 

    # Liste pour les âges 
    arrayNumber = [] 
    i = 0 
    while i < 20: 
     arrayNumber.append(i) 
     i += 1 
    arrayNumber.append("Tous") 
    dictToSend["arrayNumber"] = arrayNumber 

    # Liste pour les emplacements 
    arrayLocation = ["Tous", " ", "D", "C", "G"] 
    dictToSend["arrayLocation"] = arrayLocation 

    return render(request, 'Home/home.html', context=dictToSend) 

# Récupère le contenu d'un formulaire et le traite en fonction du type de formulaire (commun, simple ou complexe) 
def queryDataGrid(request): 
    # request.GET renvoie un QueryDict (objet Django) 
    print("YOLO") 
    parametersContent = request.GET 
    whatForm = parametersContent.getlist("typeForm")[0] 
    print(type(whatForm)) 
    try: 
     accessDLL = GSRBaseDLLAccess() 
    except: 
     print(Exception.message()) 
    if whatForm == "common": 

     table = parametersContent.getlist("table")[0] 
     road = parametersContent.getlist("road")[0] 
     if table != "location": 
      if parametersContent.getlist("age")[0] == "Tous": 
       age = 20 
       print("True") 
      else: 
       print("False") 
       age = int(unicode(parametersContent.getlist("age")[0])) 
     if road == "all": 
      road = "" 

     # on fait une requête sur les repérages 
     if table == "location": 
      result, number = accessDLL.requete_reperage(road) 
     else: 
      result, number = accessDLL.requete_table(table, road, age) 

    elif whatForm == "simple": 
     """ 
     On fait le traitement du formulaire de requêtes simples 
     Prendre en compte des ajouts des formulaires 
     On va prendre en compte les différentes lignes du formulaire et leur nombre """ 

     listConditions = [] 

     # Lignes des données 
     listQueries = dataProcessingForm("Simple", parametersContent) 

     # Checkout et les routes 
     conditionCheckout = parametersContent.getlist("conditionCheckout")[0] 
     conditionRoad = parametersContent.getlist("conditionRoad")[0] 
     conditionRoad = 'ROUTE()="' + conditionRoad + '"' 
     listConditions.append(conditionRoad) 

     # Lignes des conditions 
     j = 1 
     while j < 6: 
      if parametersContent.__contains__("conditionData" + str(j)) == True: 
       data = parametersContent.getlist("conditionData" + str(j))[0] 
       # On récupère la table de la condition 
       table = data.split(":")[0] 
       location = parametersContent.getlist("conditionLocation" + str(j))[0] 
       age = parametersContent.getlist("conditionAge" + str(j))[0] 
       condition = parametersContent.getlist("condition" + str(j))[0] 
       value = parametersContent.getlist("valueCondition" + str(j))[0] 
       conditionLine = "(" + data + condition 
       if (str(value).isdigit()): 
        conditionLine += str(value) 
       else: 
        conditionLine += '"' + str(value) + '"' 
       conditionLine += ' ET ' + table + ':generation=' + str(age) + ' ET ' + table + ':emplacement="' + location + '")' 
       if conditionCheckout == "anything": 
        conditionLine += "NON" + conditionLine 
       listConditions.append(conditionLine) 
      else: 
       break; 
      j += 1 
     #@todo modifier la condition pour la Route(), ajouter un ET tout le temps 
     if conditionCheckout == "atLeast": 
      conditionQuery = ' OR '.join(listConditions) 
     elif conditionCheckout == "all": 
      conditionQuery = ' ET '.join(listConditions) 

     result, number = accessDLL.requete_avancee(listQueries, conditionQuery) 

    elif whatForm == "complex": 
     # On fait le traitement du formulaire de requêtes complexes 

     listQueries = dataProcessingForm("Complex", parametersContent) 
     conditionQuery = parametersContent.getlist("textareaConditions")[0] 
     result, number = accessDLL.requete_avancee(listQueries, conditionQuery) 

    json = "" 
    if number[0] > 0: 
     # json à renvoyer en fonction des données des formulaires 
     listResult = [] 
     i = 0 
     while i <= number[0]: 
      listResult.append(result[i]) 
      i += 1 
     json = Utils.jsonSerializeQueryResult(listResult) 
     print(json) 

    return HttpResponse(content=json, 
         status=200, 
         mimetype="text/plain") 

def dataProcessingForm(form, parametersContent): 
    """ Mise en forme des données des formulaires pour les requêtes 
    La mise en forme est faite pour la DLL utilisée qui effectue le plus gros des requêtes 
    """  
    listQueries = [] 
    i = 1 
    while i < 6: 
     if parametersContent.__contains__("data" + form + str(i)) == True: 
      data = parametersContent.getlist("data" + form + str(i))[0] 
      location = parametersContent.getlist("location" + form + str(i))[0] 
      if parametersContent.getlist("age" + form + str(i))[0] == "Tous": 
       age = 20 
      else: 
       age = int(unicode(parametersContent.getlist("age" + form + str(i))[0])) 
      contentToAdd = data + "," + location + "," + str(age) 
      print(contentToAdd) 
      listQueries.append(contentToAdd) 
     else: 
      break; 
     i += 1 

    return ";".join(listQueries) 
+0

在标题中指出这是一个Django项目将更有可能引起您的注意,导致可能的答案。 –

+1

您应该首先从您提供的JSON中展开消息。 例如无法加载/查询/?typeForm = com ... – garmoncheg

+0

准确地说,我不知道如何显示隐藏的内容。 – Nitner

回答

-1

JS代码试图加载绝对路径/query/,但您的Django模式设置为响应^home/query。尝试使用/home/query作为您的xhr网址。

+0

-1;这里的问题显然违反了*“寻求调试帮助的问题......必须包含......必需的最短代码”*,并且应该关闭,而不是回答。 –

+0

知道有多少代码是严格必要的,可能并不清楚有人将自己描述为“实习生”。即使是这样,我不认为投票答案是特别有用的。 – jason0x43

+0

*'知道多少代码是绝对必要的可能不清楚有人形容自己是“实习生”* - 完全是他们的问题。如果他们不能创造有价值的贡献,他们不应该在这里发布。 *“即使是这样,我不认为投票答案是特别有帮助的。”* - 我明白这个观点,并且肯定有许多人分享,但我个人不同意;我想阻止你回答这样的问题,因为我认为他们损害了网站,回答他们会鼓励他们发布。请参阅https://meta.stackexchange.com/a/194989/200582。 –