Domanda

Pretty simple code but a weird situation...

have a template with this snippet:

{% is_contest story as iscontest %}

where is_contest is this custom template tag:

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

But Contest is in the django_content_type table.

Weirdest part: This is only an intermittent error, and only seems to be caused by the template tag (I do this check in views too but no errors there).

Any ideas?

EDIT: Full Traceback

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.
È stato utile?

Soluzione

One problem might be that you are comparing 2 instances with eachother, while these should be the same in Django since Django caches them, that is not a guarantee.

Not sure how/where the source_content_type comes from, but I would recommend this instead:

return isinstance(obj, contesttype)

As for the original problem, do you have a stacktrace? This error seems a bit strange.

Are you sure that Contest isn't being overwritten somewhere in the scope? Contest could be overwritten by other code in the module, the most likely suspect in that case would be a global Contest but that doesn't appear to be the case here.

[edit]

Thanks to the stacktrace the problem is a bit clearer.

This part specifically shows that it's going wrong in the obj.source_content_type part:

return obj.source_content_type == contesttype

I think that some object doesn't have an existing source_content_type anymore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top