2012-02-01 35 views
1

在實用的Django教程中獲取此錯誤。已經在這裏搜索和谷歌,並沒有發現任何提及這一點,所以我想這將是一件容易的我失蹤。例外的是在gambino_tags.py:在呈現時捕獲AttributeError:'unicode'對象沒有屬性'_default_manager'

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

models.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> 

謝謝!

回答

1

你的Nodemodel的參數__init__是一個字符串(或者至少,這就是你傳入的),而不是一個Model對象。

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] 

也許你實際上意味着...

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

+0

不應該'model = get_model(* model_args)'這一行處理這個問題嗎?我不確定我明白。 – 2012-02-01 04:35:57

+0

啊,是的。我的問題是在你編輯之前。這是有道理的。我沒有意識到我在那裏有位[1]而不是模型。謝謝! – 2012-02-01 04:37:29