2013-07-03 2 views
0

У меня есть templatetag для получения последних записей, но я не могу получить доступ к функции get_absolute_url.ImportError при использовании get_absolute_url

Моя ошибка

No module named app2 (not the name of the app I'm trying to use) 

Мой newsmodel как это:

STATUS_CHOICES = (
    (DRAFT, _('Draft')), 
    (HIDDEN, _('Hidden')), 
    (PUBLISHED, _('Published')) 
) 

TYPE_CHOICES = (
    ('normal', _('Normal')), 
    ('special', _('Special')), 
) 


class Entry(models.Model): 
    title = models.CharField(max_length=255) 
    slug = models.SlugField(max_length=255) 
    body = RichTextField(null=True, blank=True) 
    start_publication = models.DateTimeField(blank=True, null=True) 
    end_publication = models.DateTimeField(blank=True, null=True)  
    status = models.IntegerField(choices=STATUS_CHOICES, default=DRAFT) 
    arttype = models.CharField(max_length=10, choices=TYPE_CHOICES, default='normal',) 

    objects = models.Manager() 
    published = EntryPublishedManager() 

    def __unicode__(self): 
     return self.title 

    class Meta: 
     ordering = ['-start_publication'] 
     get_latest_by = 'creation_date' 


    @models.permalink 
    def get_absolute_url(self): 
      creation_date = timezone.localtime(self.start_publication) 
      return ('entry_detail',(), { 
       'year': creation_date.strftime('%Y'), 
       'month': creation_date.strftime('%b').lower(), 
       'day': creation_date.strftime('%d'), 
       'slug': self.slug}) 

Мой urls.py как это:

urlpatterns = patterns('', 
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', DateDetailView.as_view(allow_future=True, date_field='start_publication', queryset=Entry.objects.all()), name='entry_detail'), 
) 

Мои templatetag latest_news.py:

from django import template 
from apps.news.models import Entry 


register = template.Library() 

def show_news(): 
     entry = Entry.published.filter(arttype='normal').order_by('-start_publication')[:4] 
     return entry 

register.assignment_tag(show_news, name='latest_news') 

Мой frontpage.html шаблон:

{% latest_news as latest_news %} 
{% for entry in latest_news %} 
    <h2>{{ entry.title }}</h2> 
    <p><a href="{{ entry.get_absolute_url }}">Read more</a></p> 
{% endfor %} 

{{}} entry.title работает нормально. Но не .get_absolute_url. Почему он пытается импортировать другое приложение?

ответ

1

В get_absolute_url Вы забыли позвонить по номеру reverse на адрес. Вы передаете кортеж назад, что делает его недействительным. Ваш get_absolute_url должен быть:

from django.core.urlresolvers import reverse 

def get_absolute_url(self): 
     creation_date = timezone.localtime(self.start_publication) 
     return reverse('entry_detail', kwargs={ 
      'year': creation_date.strftime('%Y'), 
      'month': creation_date.strftime('%b').lower(), 
      'day': creation_date.strftime('%d'), 
      'slug': self.slug}) 

permalink decorator is deprecated and the use of reverse is recommended

+0

Да, это решило мою проблему! –

0

У вас есть ошибка где-то еще в вашем проекте, в приложении, на которое ссылается urls.py.

Функция обратного URL-поиска (которую вы неявно использовали с помощью декоратора @permalink) должна импортировать все представления, указанные в вашем файле urls.py, чтобы рассчитать правильное значение. Если у вас есть ошибка где-то, она потерпит неудачу.

Вы должны найти ссылку на app2, где бы она ни находилась, и исправить ее.

+0

Да, нашел свою ошибку, но мне все равно нужно добавить обратный к моему «get_absolute_url» для его работы. –

Смежные вопросы