Django - jak mogę uzyskać permalink do pracy z „wyrzuconym” ślimakiem

Próbuję dodać ślimaki do adresu URL w mojej aplikacji django, podobnie jak SO.

Obecnie mam strony, które działają poprawnie z takim adresem URL:

http://example.com/foo/123/

Chciałbym dodać „slugified” adresy URL w taki sposób:

http://example.com/foo/123/foo-name-here

Mogę sprawić, żeby działał dobrze, po prostu modyfikując urlconf i dodając wartość rzucania do funkcji widoku:

#urls.py

ulpatterns = patterns('project.app.views',
    url(r'^foo/(?P<foo_id>\d+)/(?P<name_slug>\w+)/

Odwiedzenie url za pomocą ślimaka działa dobrze.

Jednak mój problem polega na używaniu@models.permalink.

Dla mnieFoo model, miałem następujące, które działały dobrze:

@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id),])

Jednak po mojej zmianie, kiedy dzwonię{{ foo.get_absolute_url }} w moich szablonach wynikiem jest zawsze pusty łańcuch.

Próbowałem następujących dwóch zamiennikówget_absolute_url, z których żaden nie działa:

from django.template.defaultfilters import slugify

# attempt 1
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id), slugify(self.name)])

# attempt 2
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', (), {
        'foo_id': str(self.id), 
        'name_slug': slugify(self.name),
    })

Zauważ, że jeśli dodamprint slugify(self.name) przed powrotem, slugified nazwa pojawia się w konsoli w porządku.

Przywołując{{ foo.get_absolute_url }} w moich szablonach wynik jest zawsze pustym łańcuchem i nie mam żadnych błędów.

Wiem, że mogę zastąpić tę metodęreturn '/foo/%s/%s' % (str(self.id), slugify(self.name)), ale próbuję uzyskać permalink działający tak, że mój adres URL jest zdefiniowany tylko w jednym miejscu. Co ja robię źle?

, 'foo_detail', name='foo_detail'), ) #views.py: def foo_detail(request, foo_id, name_slug): # stuff here, name slug is just discarded

Odwiedzenie url za pomocą ślimaka działa dobrze.

Jednak mój problem polega na używaniu@models.permalink.

Dla mnieFoo model, miałem następujące, które działały dobrze:

@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id),])

Jednak po mojej zmianie, kiedy dzwonię{{ foo.get_absolute_url }} w moich szablonach wynikiem jest zawsze pusty łańcuch.

Próbowałem następujących dwóch zamiennikówget_absolute_url, z których żaden nie działa:

from django.template.defaultfilters import slugify

# attempt 1
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id), slugify(self.name)])

# attempt 2
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', (), {
        'foo_id': str(self.id), 
        'name_slug': slugify(self.name),
    })

Zauważ, że jeśli dodamprint slugify(self.name) przed powrotem, slugified nazwa pojawia się w konsoli w porządku.

Przywołując{{ foo.get_absolute_url }} w moich szablonach wynik jest zawsze pustym łańcuchem i nie mam żadnych błędów.

Wiem, że mogę zastąpić tę metodęreturn '/foo/%s/%s' % (str(self.id), slugify(self.name)), ale próbuję uzyskać permalink działający tak, że mój adres URL jest zdefiniowany tylko w jednym miejscu. Co ja robię źle?

questionAnswers(1)

yourAnswerToTheQuestion