【问题标题】:$.get() gives error, on callback (?)$.get() 给出错误,回调(?)
【发布时间】:2017-12-28 15:11:55
【问题描述】:

我知道有很多这样的问题,但我找不到我的问题的解决方案。

MyScript.js:

$('#id_tags').keyup(function(){
    var query;
    query = $(this).val();
    $.get('/blog/suggest-category/', {suggestion: query}, function(data){
      console.log('data')
      $('#suggestion_div').html(data);
    });
  });

我的view.py

def get_category_list(max_results=0, starts_with=''):
    print('get_category_list')
    cat_list = []
    if starts_with:
        cat_list = Tag.objects.filter(slug__istartswith=starts_with)
    if max_results > 0:
        if len(cat_list) > max_results:
            cat_list = cat_list[:max_results]
    return cat_list


def suggest_category(request):
    print('suggest_category')
    cat_list = []
    starts_with = ''
    if request.method == 'GET':
        starts_with = request.GET['suggestion']
        cat_list = get_category_list(5, starts_with)
    print('cat_list', cat_list)
    #return render(request, 'blog/suggest_tag.html', {'suggestions': cat_list })
    return cat_list

query,在MyScript.js 中是一个字符串。视图被调用(我可以阅读print('cat_list', cat_list)),但随后它抛出一个错误:

当列表为空时 =>AttributeError: 'list' object has no attribute 'get'

什么时候不是(例如:cat_list [<Tag: Home>])=> ValueError: too many values to unpack (expected 2)

cat_list 为空的回溯错误:

cat_list []
Internal Server Error: /blog/suggest-category/
Traceback (most recent call last):
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\core\handlers\base.
py", line 235, in get_response
    response = middleware_method(request, response)
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\middleware\clickjac
king.py", line 31, in process_response
    if response.get('X-Frame-Options') is not None:
AttributeError: 'list' object has no attribute 'get'
[28/Dec/2017 16:25:08] "GET /blog/suggest-category/?suggestion= HTTP/1.1" 500 14
867

或者 cat_list 不为空:

cat_list [<Tag: Home>]
Internal Server Error: /blog/suggest-category/
Traceback (most recent call last):
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\core\handlers\base.
py", line 235, in get_response
    response = middleware_method(request, response)
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\middleware\clickjac
king.py", line 31, in process_response
    if response.get('X-Frame-Options') is not None:
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\db\models\query.py"
, line 378, in get
    clone = self.filter(*args, **kwargs)
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\db\models\query.py"
, line 790, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\db\models\query.py"
, line 808, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\db\models\sql\query
.py", line 1243, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\db\models\sql\query
.py", line 1269, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "D:\Python\Envs\possedimenti\lib\site-packages\django\db\models\sql\query
.py", line 1146, in build_filter
    arg, value = filter_expr
ValueError: too many values to unpack (expected 2)
[28/Dec/2017 16:08:23] "GET /blog/suggest-category/?suggestion=h HTTP/1.1" 500 1
5797

或许可以帮助TAG模型,来自taggit:

@python_2_unicode_compatible
class TagBase(models.Model):
    name = models.CharField(verbose_name=_('Name'), unique=True, max_length=100)
    slug = models.SlugField(verbose_name=_('Slug'), unique=True, max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        if not self.pk and not self.slug:
            self.slug = self.slugify(self.name)
            from django.db import router
            using = kwargs.get("using") or router.db_for_write(
                type(self), instance=self)
            # Make sure we write to the same db for all attempted writes,
            # with a multi-master setup, theoretically we could try to
            # write and rollback on different DBs
            kwargs["using"] = using
            # Be oportunistic and try to save the tag, this should work for
            # most cases ;)
            try:
                with atomic(using=using):
                    res = super(TagBase, self).save(*args, **kwargs)
                return res
            except IntegrityError:
                pass
            # Now try to find existing slugs with similar names
            slugs = set(
                self.__class__._default_manager
                .filter(slug__startswith=self.slug)
                .values_list('slug', flat=True)
            )
            i = 1
            while True:
                slug = self.slugify(self.name, i)
                if slug not in slugs:
                    self.slug = slug
                    # We purposely ignore concurrecny issues here for now.
                    # (That is, till we found a nice solution...)
                    return super(TagBase, self).save(*args, **kwargs)
                i += 1
        else:
            return super(TagBase, self).save(*args, **kwargs)

    def slugify(self, tag, i=None):
        slug = default_slugify(unidecode(tag))
        if i is not None:
            slug += "_%d" % i
        return slug


class Tag(TagBase):
    class Meta:
        verbose_name = _("Tag")
        verbose_name_plural = _("Tags")
        app_label = 'taggit'

编辑: 我改变了我的view.py

def suggest_category(request):
    print('suggest_category')
    cat_list = []
    starts_with = ''
    if request.method == 'GET':
        starts_with = request.GET['suggestion']
        cat_list = get_category_list(5, starts_with)
    print('cat_list', cat_list)
    return render(request, 'blog/suggest_tag.html', {'suggestions': cat_list })

这是我的模板suggest_tag.html

{% load i18n %}

     <ul>
        {% if suggestions %}
            {% for c in suggestions %}
                <li>{{ c.name }}</li>
            {% endfor %}
        {% else %}
            <li>{% trans "There are no tag present." %}</li>
        {% endif %}
    </ul>

现在它在我创建的一个部门 (id='suggestion_div') 中写入,所以它可以正常工作。

/编辑

【问题讨论】:

  • Python 世界的回溯告诉我们错误在哪里,但您没有包含它。我在任何地方都没有看到对.get 的呼叫,我错过了吗?
  • .get 在第 4 行的脚本中被调用(但可能你在说别的......)无论如何添加了 Traceback。
  • 这是 JavaScript .get 调用,但您遇到了 Python 错误
  • 看起来你正在将一个列表传递给你的 ORM,它需要一个字典。我想这就是你打电话给Tag.objects.filter() 的地方,但我不能把它变成一个像样的答案。
  • type(cat_list) = &lt;class 'django.db.models.query.QuerySet'&gt;suggest_category 返回之前。 TAG来自taggit模型,现在我会找到并添加到问题中

标签: jquery django get


【解决方案1】:

您的错误是由从您的视图返回的不是 HttpResponse 的内容引起的。

从代码中并不清楚您想要发送到 JavaScript 的确切内容,但无论它是什么,都需要包装在 HttpResponse 或其子类中。也许你想序列化一个查询集?

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2016-08-07
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多