【问题标题】:Django can AJAX field filter be designed with CreateView?Django 可以用 CreateView 设计 AJAX 字段过滤器吗?
【发布时间】:2020-09-21 06:29:34
【问题描述】:

我已经有一个CreateView 来处理创建对象。我想知道是否可以简单地将 AJAX 响应放在 get 方法中,以允许根据先前的选择过滤表单字段。

例如如果用户在“类别”字段中选择了一个名为“食品/饮料”的选项,那么我将通过 AJAX 请求发送到 GET 为该类别过滤的查询集,然后更新表单。

是这样实现的吗?

这通常是在get_queryset 方法还是其他方法中完成?

这通常在单独的视图中完成吗?我应该为此使用与CreateView 不同的通用View 吗?

【问题讨论】:

  • 对象是否需要异步创建。也?或者逻辑如何?
  • 不,我想用 HTML 提交表单。只想为用户过滤表单。

标签: python django python-3.x ajax


【解决方案1】:

让我给你一个开始。

通常的做法是使用 Ajax 异步触发视图函数。基本设置如下所示:

Ajax

get_queryset = function () {
    $.ajax('get_queryset/', {
            method: 'GET',
            async: "True",
            dataType: "json",
            success: function(response) {
              var queryset = response;

              item = queryset[0].fields.datafield;

            },
    })
}

Views.py

# Async Function for Ajax

def get_query(*args, **kwargs):

    # Query all Objects from Model
    queryset = serializers.serialize('json', Entry.objects.all())
    return HttpResponse(queryset)

Urls.py

urlpatterns = [

    path('app/get_queryset/', get_query),
]

我希望这就是你所指的。

关于过滤的编辑:

您直接在视图中过滤查询集。以便服务器通过 AJAX 向客户端返回所需的数据。另请注意,适当的查询过滤可以减少对数据库的查询量,从而提高速度(尽管这不应该是小型应用程序的关键影响)。

Django 中内置了一大堆过滤器和异常方法: https://docs.djangoproject.com/en/3.0/topics/db/queries/

检查making queries

此外,如果您想用新数据更新您的 html,您可以循环查询数据集并为查询集中的每个项目操作目标 html,如下所示:

{% for item in queryset %}

<p>{{ item.field_name_one }}</p>
          [...]
          [...]
<p>{{ item.field_name_two }}</p>

{% endfor %}

所以如果数据库查询从数据库中返回 5 个项目,它将创建 5 个&lt;p&gt; 元素。

【讨论】:

  • 是的,所以处理表单过滤器更新将在 CreateView 之外,在我接受的独立视图函数中。我要做的是返回由 AJAX 请求过滤的Categories,然后反序列化数据并相应地更新表单?
  • 而不是get_query,我可能会使用类似:def filter_test_questions_by_category,对吧?
  • 是的,查询集中的对象可以直接在视图函数中过滤。 AJAX 期望返回 json,因此我们在处理 Ajax/Django 异步 http 请求时必须进行序列化和反序列化。使用 Ajax,我们总是期望这样返回一个 http 响应。
  • 您可以查看官方 Django 文档中的making queries。选项是无限的。乐于助人,并从德国到美国致以最诚挚的问候。请参阅我的答案中的更新
  • @DavidAlford 刚刚发现本教程似乎与您的挑战非常匹配:pluralsight.com/guides/work-with-ajax-django ...现在够了! :D 祝你好运!
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2019-10-22
  • 2012-07-08
  • 2016-11-07
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多