Cuando se usa con flatpages reverse() y get_abolute_url() devuelve diferentes resultados:
>>> about = FlatPage.objects.get(id=2) >>> >>> about <FlatPage: /about-us/ -- About us page> >>> >>> about.url >>> '/about-us/' >>> >>> about.get_absolute_url() '/about-us/' >>> >>> >>> reverse('django.contrib.flatpages.views.flatpage', args=[about.url]) '/%2Fabout-us/' ## from where %2F comes from ? >>> Aquí está el urls.py el sitio:
from django.conf.urls import url, include from django.contrib import admin from django.contrib .flatpages import urls as flatpage_urls # from . import blog urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'', include(flatpage_urls)), ] Aunque puedo acceder a la página Acerca de en http://127.0.0.1:8000/about-us/ . ¿De dónde viene %2F ?
Esperaba que ambos métodos devolvieran el mismo resultado. Que está pasando aqui ?
Actualizar:
Aquí está flatpages/urls.py
from django.conf.urls import url from django.contrib.flatpages import views urlpatterns = [ url(r'^(?P<url>.*)$', views.flatpage, name='django.contrib.flatpages.views.flatpage'), ]Actualización 2:
Urls.py actualizado a:
urlpatterns = [ url(r'^admin/', include(admin.site.urls)), # url(r'', include(flatpage_urls)), ] urlpatterns += [ url(r'^(?P<url>.*/)$', views.flatpage), ]Me parece que está tratando de insertar una URL dentro de otra URL, lo que parece extraño.
De su código:
reverse('django.contrib.flatpages.views.flatpage', args=[about.url]) También ha aclarado about.url contiene /about-us/ . Esta cadena se citará e insertará en la URL:
http://hostname.example/<here>/O:
http://hostname.example/%2Fabout-us%2F/Sin embargo, no entiendo por qué no ves el último %2F.
django.contrib.flatpages aparentemente es incompatible con reverse() con args o kwargs. El uso previsto es con su etiqueta personalizada:
{% load flatpages %} {% get_flatpages as flatpages %} <ul> {% for page in flatpages %} <li><a href="{{ page.url }}">{{ page.title }}</a></li> {% endfor %} </ul>Fuente Flatpages > Obtener una lista de objetos FlatPage en sus plantillas
FlatPage.get_absolute_url() simplemente devuelve lo que está en el campo self.url , que en su ejemplo es una cadena encerrada entre barras, es decir, '/sobre-nosotros/'.
def get_absolute_url(self): # Handle script prefix manually because we bypass reverse() return iri_to_uri(get_script_prefix().rstrip('/') + self.url) Por otro lado, reverse() llama a _reverse_with_prefix() , que antepone una barra inclinada / a la URL, lo que resulta en //about-us/ . Luego, determina falsamente que la doble barra inclinada significa un intento de reescritura del esquema, por lo que reemplaza la segunda barra inclinada con el código URL ASCII %2f para neutralizarlo.
Desafortunadamente, el validador de formularios para FlatPage.url requiere que el / :
def clean_url(self): url = self.cleaned_data['url'] if not url.startswith('/'): raise forms.ValidationError( ugettext("URL is missing a leading slash."), ...Puede solucionarlo usando un prefijo sin una barra, como:
url(r'^pages', include(django.contrib.flatpages.urls)) pero esto también coincidiría con pagesabout-us/ . Si elimina el prefijo por completo como con r'^' , _reverse_with_prefix() prefijará un / en un intento de evitar la vinculación relativa.
Puede codificar las URL como el tercer ejemplo de https://docs.djangoproject.com/en/1.11/ref/contrib/flatpages/#using-the-urlconf , pero esto anula el propósito de administrar las URL en las páginas planas. mesa.
from django.contrib.flatpages import views urlpatterns += [ url(r'^about-us/$', views.flatpage, {'url': '/about-us/'}, name='about'), url(r'^license/$', views.flatpage, {'url': '/license/'}, name='license'), ]