2012-02-01 3 views
1

Practical Django 튜토리얼에 이어이 오류를 가져 오십시오. 여기에서 Google과 Google을 검색해 봤지만 아무 것도 발견하지 못했기 때문에 쉽게 누락 될 수 있다고 생각합니다. 예외 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

당신의 Node__init__model 인수는 문자열 (또는 적어도, 그것은 당신이 전달하는 기능)가 아닌 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)'줄을 신경 쓰지 않아야합니까? 이해할 수 있을지 모르겠다. –

+0

아 예. 제 질문은 당신의 편집 전이었습니다. 이것은 의미가 있습니다. 모델 대신에 비트가 있음을 나는 깨닫지 못했다. 감사! –

관련 문제