Django 和 AngularJS - 向 Angular 发送查询 JSON 数据

Posted

技术标签:

【中文标题】Django 和 AngularJS - 向 Angular 发送查询 JSON 数据【英文标题】:Django and AngularJS - Sending query JSON data to Angular 【发布时间】:2015-02-01 15:27:24 【问题描述】:

编辑:我使用的是 Django 开发版,所以我可以访问 JsonResponse(如下所示)。

我在搞乱 Django 并试图让它与 AngularJS 一起工作。目前我正在尝试一次从数据库中查询 4 ​​行并将结果作为 JSON 对象发送到 Angular 脚本。我只是不断遇到问题 - 它不会工作。

在 *** 上进行大量搜索以尝试帮助自己解决问题后,这就是我的代码现在所在的位置:

# views.py

class AJAXListMixin(object):
    def dispatch(self, request, *args, **kwargs):
        if not request.is_ajax():
            raise Http404("Improper access.")
        return super(object, self).dispatch(request, *args, **kwargs)

    def get_queryset(self):
        return Project.objects.filter(added__lte=timezone.now())

    def get(self, request, *args, **kwargs):
        return JsonResponse(self.get_queryset(), safe=False)


class PageApi(AJAXListMixin, generic.ListView):
    paginate_by = 4  # 4 results per page
    ordering = '-added'  # Most recent to oldest

----------------------
# models.py

class Project(models.Model):
    title = models.CharField(max_length=100)
    desc = models.TextField()
    link = models.URLField(default=None, blank=True, null=True)

    slug = models.SlugField(null=True)
    added = models.DateField(_("Date Added"), default=datetime.today)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Project, self).save(*args, **kwargs)

    def as_dict(self):
        return 
            "title": self.title,
            "description": self.desc,
            "link": self.link,
            "slug": self.slug,
            "date": self.added,
            "previews": 
                preview.as_dict() for preview in self.preview_set.all()
            
        


class Preview(models.Model):
    project = models.ForeignKey(Project)
    file = models.FileField(upload_to='project/preview/')

    def __str__(self):
        return "project Preview id".format(
            project=self.project.title, id=self.id
        )

    def as_dict(self):
        return 
            "url": self.file.url
        

这是我开始使用的角度代码:

projects = angular.module("Projects", []);

projects.config(['$httpProvider', function ($httpProvider) 
  $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
]);

projects.controller("ProjectList", ['$scope', '$http', function ($scope, $http) 
  $scope.projects = ;
  $scope.page = 1;

  $http.get('api/page/' + $scope.page)
      .success(function (response) 
        console.log(response)
      )
      .error(function (status) 
        alert("Error. Check network logs.");
      );
]);

我想将响应存储在项目 $scope 变量中,以便我可以对我的角度模板中的数据进行处理。

【问题讨论】:

【参考方案1】:

我建议看看下面的帖子:

http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html 或者这个https://thinkster.io/django-angularjs-tutorial/

它介绍了在 Django 中设置 REST API 以序列化您的模型,并指定要序列化的字段并使用 Django Rest 框架返回 JSON 数据。

请注意,该示例使用 CoffeeScript 并使用 GruntJS 将其编译为 javascript

相反,您的 Angular 控制器应该看起来更像以下内容(假设您有一个 URL '/api/projects/',它路由到返回包含多个项目的 JSON 对象的 API 视图):

$scope.projects = [];
$http.get('/api/projects/').success(function(data) 
    $scope.projects = data;
    console.log($scope.projects);

);

不确定这将如何与额外的分页一起使用,但您可以在 Django Rest Framework 文档中阅读更多相关信息:

http://www.django-rest-framework.org/api-guide/pagination/

希望这会有所帮助!

【讨论】:

我对如何创建我的序列化程序来访问我想要的预览图像有点迷茫。我目前没有一个 url 路径来单独查看与它们关联的项目的预览图像。有没有办法设置序列化程序以获取图像的 url 而无需设置路由?见pastebin.com/AaVzGyer Preview 是如何与 Project 关联的? 一个项目有一个或多个预览图像。每个图像(预览)都是从项目条目的管理界面上传的单个图像。 Snig501,您可以在这里查看更多详细信息:reddit.com/r/django/comments/2o87mq/… 以下有帮助吗? django-rest-framework.org/api-guide/relations/…(抱歉,我现在正在工作,所以目前无法提供大量帮助 - 即我无法自己测试:P)

以上是关于Django 和 AngularJS - 向 Angular 发送查询 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 令牌丢失或不正确。 Django + AngularJS

使用 angular 向 django-rest 发送 DELETE 请求被解释为 OPTIONS

Django、Nginx、Gunicorn 和 AngularJS 应用程序结构

Django 和 AngularJS:如何显示来自 Django 调试错误消息的 Angular $http 错误

Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?

Facebook Auth 与 AngularJS 和 Django REST 框架