2013-11-17 1 views
0

Я разрабатываю один из своих сайтов с django python, где я использую angularjs на одной из своих страниц, где я дал пользователю возможность поиска (конкретного запроса). Вот моя модель ..Django AngularJS JSONResponse view в рендеринге json output

class Request(models.Model): 
    description = models.TextField(blank=True,null=True) 
    category = models.ForeignKey(Category) 
    sub_category = models.ForeignKey(SubCategory) 

В моих взглядах я возвращаюсь через следующий код:

def some(code, x): 
    exec code 
    return x 

def search_request(request): 
    page = request.GET.get('page') 
    term = request.GET.get('term') 
    i = 0 

    terms = "x = Request.objects.filter(" 
    for t in term.split(" "): 
     i=i+1 
     if(len(term.split(" "))>i): 
      terms = terms +"Q(name__icontains='"+t+"')|" 
     else: 
      terms = terms +"Q(name__icontains='"+t+"'))" 

    junk = compile(terms,'<string>', 'exec') 

    spit = Request.objects.filter(name__icontains=term) 
    requests = some(junk,spit) 

    output = HttpResponse() 
    output['values']=[{'requests':r,'category':r.category,'subcategory':r.sub_category} for r in requests] 
    return JSONResponse(output['values']) 

В моем HTML коде, когда я возвращаюсь с помощью AngularJS:

$scope.search = function(){ 
    $scope.results = $http.get("{% url 'search-requests-show' %}?term="+$scope.term).then(
     function(result){ 
      return result.data; 
     } 
    ); 
} 

Результата на выходе HTML поступает как в {[{results}]}:

"[{'category': <Category: The New Category>, 'requests': <Request: Need a Table>, 'subcategory': <SubCategory: Testsdfsdfsad>}]" 

Проблема заключается в том, что я не в состоянии получить доступ с помощью results.category, потому что выход в «строки», так что «результат в результатах» нг-повтор = приносит результат как

[ { ' c a ..... 

Я возможно, что-то не так. Если у кого-нибудь есть предложение, ответьте пожалуйста.

+0

Не в тему, но «компилировать» действительно необходимо? –

ответ

1

JSONResponse, вероятно, использует стандартный датчик питон JSon, который на самом деле не закодировать объект для вас, а он выводит строковое представление (repr), поэтому вывод <Category: The New Category>.

Вы, возможно, потребуется использовать некоторый внешний класс сериализатора для обработки объектов Джанго, как:

http://web.archive.org/web/20120414135953/http://www.traddicts.org/webdevelopment/flexible-and-simple-json-serialization-for-django

Если нет, то вы должны нормализовать объект на простые типы питона внутри вида (DICT, список строк .., вид, что json-модуль не имеет проблемной кодировки). Так что вместо того, чтобы делать:

'category':r.category 

вы могли бы сделать:

'category': {'name': r.category.name} 

Кроме того, как заметка на полях: использование exec является супер плохая идея. Не используйте его в производстве!

0

Вы должны вернуть JSon строки для Угловая:

import json 
def resource_view(request): 
    # something to do here 
    return HttpResponse(json.dumps(your_dictionary)) 

для лучшего использования я рекомендую djangorestframework.

Off Тема:

$http.get("{% url 'search-requests-show' %}?term="+$scope.term); 

вы можете передать 'парам' объект:

$http.get("{% url 'search-requests-show' %}", {param : {term:$scope.term}});