2013-01-05 17 views
5

Witaj Migrację do mojej aplikacji, aby korzystać z widoków opartych na klasach zamiast widoków opartych na funkcjach. W moim starym kodem udało mi się uzyskać absolutną URL obiektu związanego z myślą funkcji w ten sposób:Uzyskaj bezwzględny adres URL w Django podczas korzystania z widoków opartych na klasach

class Category(models.Model): 
    name = models.CharField(max_length=100,unique=True) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 
    parent = models.ForeignKey('self',null=True,blank=True) 

    def get_absolute_url(self): 
     return reverse('blog.views.showcategory',args=[str(self.slug)]) 

nie mogłem znaleźć to, co powinienem zmienić w moim get bezwzględnej funkcji URL w celu uzyskania jak ten sam wynik.

To jest moja nowa klasa widok oparty

class CategoryView(ListPosts): 
    template_name = "postlist.html" 
    context_object_name="posts" 
    def get_queryset(self): 
     return Post.objects.filter(category__slug=self.kwargs['slug']).order_by('created') 

Dzięki!

+1

Jak wygląda odpowiednia linia w twoim urlconf? A jaki błąd rzuca na ciebie Django? –

Odpowiedz

19

Zawsze należy podać adresy URL nazwę, a które odnoszą się do:

url(r'/category/(?P<slug>\w+)/$', CategoryView.as_view(), name='category_view'), 

Teraz:

@models.permalink 
def get_absolute_url(self): 
    return ('category_view',(), {'slug': self.slug}) 

Uwaga Użyłem dekorator permalink, który działa tak samo jak wywołanie reverse ale jest trochę schludniejszy.

+7

Zgodnie z dokumentami 1.6, dekorator permalink nie jest już zalecany: https://docs.djangoproject.com/en/1.6/ref/models/instances/#the-permalink-decorator – highpost

+0

zadziałało to nawet z django 1.10. – javed

6

Oto moja konfiguracja get_absolute_url:

urls.py

urlpatterns = patterns('', 
    url(r'^products/(?P<slug>[\w\d\-\_]+)/$', views.ProductView.as_view(), name='product'), 
    ) 

models.py

def get_absolute_url(self): 
    return reverse('products:product', kwargs={'slug':self.slug}) 

Moje urls.py jest pod "Produkty" aplikacji, więc przestrzeń nazw adresów URL to "produkty: produkt"

+0

A jeśli wyrażenie regularne nie zostało tak nazwane: url (r '^ products/([\ w \ d \ - \ _] +)/$', views.ProductView.as_view(), name = 'product') , ) w jaki sposób wprowadzić parametr kwargs? kwargs = self.slug nie działa. – Reveclair

+0

@Reveclair 'kwargs' jest słownikiem słownika kluczowego, więc nie chciałbyś ustawić go jako' self.slug'. Możesz wprowadzić parametry do 'kwargs' jak każdy inny słownik python. tj. 'kwargs ['foo'] = 'bar''. Ponadto w Django tylko nazwane parametry URL są wstrzykiwane do 'kwargs', więc ważne jest, aby nazwać je w wyrażeniu URL. –

Powiązane problemy