Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

294
Views
Django: reverse() y get_absolute_url() devuelven resultados diferentes para el mismo objeto.

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), ]
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report

0

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

¿Por qué el %2f?

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'), ]
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!