2013-01-05 10 views
5

Ciao Sto migrando la mia app per utilizzare le viste basate sulla classe invece delle viste basate sulla funzione. Nel mio vecchio codice sono stato in grado di ottenere l'URL assoluto di un oggetto relativa a una visione funzione in questo modo:Ottieni URL assoluto in Django quando si utilizzano le viste basate sulla classe

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)]) 

non riuscivo a trovare che cosa devo cambiare nella mia funzione Get URL assoluto al fine di ottenere il stesso risultato.

Questa è la mia nuova classe di visualizzazione in base

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') 

Grazie!

+1

Che aspetto ha la linea appropriata nel proprio urlconf? E quale errore ti butta Django? –

risposta

19

Si deve sempre dare il vostro URL un nome, e si riferiscono a quanto segue:

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

Ora:

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

Nota Ho usato il decoratore permalink, che fa lo stesso di chiamare reverse ma è un po 'più ordinato.

+7

Secondo i documenti 1.6, il decoratore permalink non è più raccomandato: https://docs.djangoproject.com/en/1.6/ref/models/instances/#the-permalink-decorator – highpost

+0

funzionava anche con django 1.10. – javed

6

Ecco la mia configurazione 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}) 

mio urls.py è sotto il "prodotti" app, quindi lo spazio dei nomi dell'URL è "prodotti: prodotto"

+0

E se il regexp non è stato chiamato in questo modo: url (r '^ prodotti/([\ w \ d \ - \ _] +)/$', views.ProductView.as_view(), name = 'product') , ) come si dovrebbe iniettare il parametro kwargs? kwargs = self.slug non funziona. – Reveclair

+0

@Reveclair 'kwargs' è un dizionario di parole chiave, quindi non si vorrebbe impostare uguale a' self.slug'. È possibile inserire parametri in 'kwargs 'come qualsiasi altro dizionario python. ad esempio 'kwargs ['foo'] = 'bar''. Inoltre, per Django, solo i parametri URL con nome vengono iniettati in 'kwargs', quindi è importante nominarli nella regex dell'URL. –

Problemi correlati