2013-04-11 2 views
1

Я пытаюсь использовать reverse для get_absolute_url в одной из моих моделей. Тем не менее, он возвращает пустую строку.Обратное возвращение пустой строки в get_absolute_url

url.py

url(
    regex=r'^$', 
    view=SocietyView.as_view(), 
    name='society', 
), 
url(
    regex=r'^(?P<tagname>[\w ]+)/?$', 
    view=SocietyView.as_view(), 
    name='society_with_tag', 
), 

model.py

class Tag(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    posts = models.ManyToManyField(Post, related_name='tags', null=True, blank=True) 

    def __unicode__(self): 
     return self.name 

    def get_absolute_url(self): 
     return reverse("society_with_tag", kwargs={"tagname": self.name}) 

template.html

<a href="{{ tag.get_absolute_url }}"> 
    {{ tag.name }} 
</a> 

result.html

<a href=""> 
    tag 
</a> 
+0

Я незнаком с Джанго 'обратная функция()', но следует не 'kwarg' ключ в' get_absolute_url() '' быть "tag.name" ', а не' 'тэг" '? –

+0

Kwargs предназначены для url.py, который имеет имя . Следовательно, «тэг» правильный. Я думаю ... – taelimoh

+0

Ах. Я вижу, как я уже сказал, я не знаком с картой Django. –

ответ

1

Я понятия не имею, почему, но удаление ',' в конце концов решило эту проблему.

И Екатерина и Кайо дали мне отличные ответы, но поскольку я не использую 1.5, это не так.

Я изменил

def get_absolute_url(self): 
    return reverse("society_with_tag", args=[self.name,]) 

в

def get_absolute_url(self): 
    return reverse("society_with_tag", args=[self.name]) 
2

вы должны предоставить app_name

@property 
def get_absolute_url(self): 
    return reverse("app_name:society_with_tag", args=[self.name]) 
+0

Спасибо за отличный ответ. – taelimoh

1

Убедитесь, что вы проверка имени тега, так что всегда будет соответствовать вашему регулярному выражению [\w ]+

В противном случае вы можете использовать более широкий профиль регулярное выражения [^/]+, что не будет соответствовать ничего до следующего /

Например, в вашем urls.py, используйте:

url(r'^(?P<tagname>[^/]+)/$', SocietyView.as_view(), 
    name='society_with_tag'), 

Обратите внимание, что вам нужно только «/?» если вы изменили значение по умолчаниюAPPEND_SLASHна Ложный

И в вашем models.py:

@models.permalink 
def get_absolute_url(self): 
    return ('society_with_tag', [self.name]) 

Помните, что если вы используете URL namespaces вам нужно будет добавить префикс к имени вида:

@models.permalink 
def get_absolute_url(self): 
    return ('app_name:society_with_tag', [self.name]) 
+0

Спасибо за отличный ответ. – taelimoh

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