Atrapado AttributeError mientras se renderiza: el objeto 'unicode' no tiene atributo '_default_manager'

Obtenga este error siguiendo el tutorial práctico de Django. He buscado aquí y en Google y no he encontrado ninguna mención de esto, así que imagino que va a ser algo fácil que me estoy perdiendo. La excepción está en gambino_tags.py:

context[self.varname] = self.model._default_manager.all()[:self.num]

modelos.py

class Entry(models.Model):
    # Entry types
    LIVE_STATUS = 1
    DRAFT_STATUS = 2
    HIDDEN_STATUS = 3
    STATUS_CHOICES = (
        (LIVE_STATUS, 'Live'),
        (DRAFT_STATUS, 'Draft'),
        (HIDDEN_STATUS, 'Hidden'),
    )
    # Foreign Key
    author = models.ForeignKey(User)
    title = models.CharField(max_length=250, help_text='Maximum 250 characters.')
    # Bit of redundancy with excerpt & excerpt_html and body & body_html, but seems to be cleanest way to seperate plain text and html
    excerpt = models.TextField(blank=True, help_text='Add an excerpt - a short summary of your post.')
    excerpt_html = models.TextField(editable=False, blank=True)
    body = models.TextField(help_text='Add the content of your post.')
    body_html = models.TextField(editable=False, blank=True)
    pub_date = models.DateTimeField(default=datetime.datetime.now)
    # Slug prepopulated from title in admin.py
    slug = models.SlugField(unique_for_date='pub_date', help_text="Suggested value automatically generated from title. Must be unique.")
    enable_comments = models.BooleanField(default=True)
    featured = models.BooleanField(default=False, help_text="Make this post featured. Will provide additional sorting.")
    status = models.IntegerField(choices=STATUS_CHOICES, default=LIVE_STATUS)
    categories = models.ManyToManyField(Category)
    tags = TagField()
    # Adds objects and live override from LiveEntryManager class above
    live = LiveEntryManager()
    objects = models.Manager()

gambino_tags.py

from django import template
from django.db.models import get_model

def do_latest_content(parser, token):
    bits = token.contents.split()
    # Checks to make sure that there are 5 words in the tag
    if len(bits) != 5:
        raise template.TemplateSyntaxError("'get_latest_content' tag takes exactly four arguments")
    model_args = bits[1].split('.')
    # Checks to make sure first argument is appname.model name
    if len(model_args) != 2:
        raise template.TemplateSyntaxError("First argument to 'get_latest_content' must be an 'application name'.'model name' string")
    model = get_model(*model_args)
    # Checks to make sure model is != none
    if model is None:
        raise template.TemplateSyntaxError("'get_latest_content' tag got an invalid model: %s" % bits[1])
    return LatestContentNode(bits[1], bits[2], bits[4])

class LatestContentNode(template.Node):
    def __init__(self, model, num, varname):
        self.model = model
        # convert num to int
        self.num = int(num)
        self.varname = varname

    def render(self, context):
        # uses default manager for Entry.live.all() instances
        context[self.varname] = self.model._default_manager.all()[:self.num]
        return ''

register = template.Library()
register.tag('get_latest_content', do_latest_content)

base.html

        {% load gambino_tags %}
        <h2>Five latest entries:</h2>
        <ul>
            {% get_latest_content gambino.entry 5 as latest_entries %}
            {% for entry in latest_entries %}
            <li>
                <a class="list" href="{{ entry.get_absolute_url }}">{{ entry.title }}</a>
                Posted {{ entry.pub_date|timesince }} ago.
            </li>
            {% endfor %}
        </ul>
        <h2>Five latest links:</h2>
        <ul>
            {% get_latest_content gambino.link 5 as latest_links %}
            {% for link in latest_links %}
            <li>
                <a href="{{ link.get_absolute_url }}">{{ link.title }}</a>
                Posted {{ link.pub_date|timesince }} ago.
            </li>
            {% endfor %}
        </ul>

¡Gracias!

preguntado el 01 de febrero de 12 a las 04:02

1 Respuestas

La model argumento de tu Node's __init__ es una cadena (o al menos, eso es lo que estás pasando), no una Model objeto.

bits = token.contents.split()
...
return LatestContentNode(bits[1], bits[2], bits[4])
...
class LatestContentNode(template.Node):
    def __init__(self, model, num, varname):
    self.model = model
...
context[self.varname] = self.model._default_manager.all()[:self.num]

Quizás en realidad quisiste decir ...

return LatestContentNode(model, bits[2], bits[4])

?

Respondido 01 Feb 12, 08:02

¿No debería la línea model = get_model(*model_args) aunque te encargas de eso? No estoy seguro de entender. - Dan Hoerst

Ahhh si. Mi pregunta fue antes de su edición. Esto tiene sentido. No me di cuenta de que tenía los bits [1] en lugar del modelo. ¡Gracias! - Dan Hoerst

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.