0

非常に単純なコードですが、奇妙な状況です...

このスニペットを含むテンプレートがあります:

{% is_contest story as iscontest %}

ここで、is_contestはこのカスタムテンプレートタグです。

@register.assignment_tag
def is_contest(obj):
    contesttype = ContentType.objects.get_for_model(Contest)
    return obj.source_content_type == contesttype

ただし、コンテストはdjango_content_typeテーブルにあります。

奇妙な部分:これは断続的なエラーであり、テンプレートタグが原因であると思われます(ビューでもこのチェックを行いますが、エラーはありません)。

何か案は?

編集:完全なトレースバック

Traceback (most recent call last):

  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "/home/ubuntu/src/cbframe/commentableobjects/views/commentableobject_list.py", line 142, in commentablobject_list
    return render_to_response('commentableobjects-list.html', info, context_instance=RequestContext(request))

  File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py", line 20, in render_to_response
    return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

  File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py", line 176, in render_to_string
    return t.render(context_instance)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 140, in render
    return self._render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 823, in render
    bit = self.render_node(node, context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 74, in render_node
    return node.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 123, in render
    return compiled_parent._render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 823, in render
    bit = self.render_node(node, context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 74, in render_node
    return node.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 823, in render
    bit = self.render_node(node, context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 74, in render_node
    return node.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 281, in render
    return nodelist.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 823, in render
    bit = self.render_node(node, context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 74, in render_node
    return node.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 155, in render
    return self.render_template(self.template, context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 137, in render_template
    output = template.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 140, in render
    return self._render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 823, in render
    bit = self.render_node(node, context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 74, in render_node
    return node.render(context)

  File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 185, in render
    nodelist.append(node.render(context))

  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 1139, in render
    context[self.target_var] = func(*resolved_args, **resolved_kwargs)

  File "/home/ubuntu/src/cbframe/commentableobjects/templatetags/url_target_blank.py", line 27, in is_contest
    return obj.source_content_type == contesttype

  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 350, in __get__
    rel_obj = qs.get(**params)

  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 366, in get
    % self.model._meta.object_name)

DoesNotExist: ContentType matching query does not exist.
4

1 に答える 1

1

1つの問題は、2つのインスタンスを相互に比較していることですが、Djangoはそれらをキャッシュするため、Djangoでも同じである必要がありますが、これは保証ではありません。

どのように/どこからsource_content_type来たのかわかりませんが、代わりにこれをお勧めします:

return isinstance(obj, contesttype)

元の問題については、スタックトレースがありますか?このエラーは少し奇妙に思えます。

Contestスコープのどこかで上書きされていませんか ?Contestモジュール内の他のコードによって上書きされる可能性があります。その場合、最も疑わしいのはですが、global Contestここではそうではないようです。

[編集]

スタックトレースのおかげで、問題は少し明確になります。

この部分は、この部分で問題が発生していることを具体的に示していますobj.source_content_type

return obj.source_content_type == contesttype

一部のオブジェクトにはもう存在しないと思いますsource_content_type

于 2012-08-28T23:36:04.023 に答える