You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Analicemos cada parámetro de `ImageField` por separado:
1876
1876
1877
-
==="`uploads_to` :material-upload:"
1877
+
==="`upload_to` :material-upload:"
1878
1878
1879
-
El atributo `uploads_to` de un campo `ImageField` o `FileField` nos indica la carpeta a la que se van a subir los ficheros como **ruta relativa** a [`settings.MEDIA_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-MEDIA_ROOT) que, por defecto, es la raíz de nuestro proyecto.
1879
+
El atributo `upload_to` de un campo `ImageField` o `FileField` nos indica la carpeta a la que se van a subir los ficheros como **ruta relativa** a [`settings.MEDIA_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-MEDIA_ROOT) que, por defecto, es la raíz de nuestro proyecto.
1880
1880
1881
-
Es decir que si tenemos `#!python uploads_to='covers'` esto crearía una carpeta `covers` en el raíz de nuestro proyecto con las imágenes (_portadas_) de los «posts» que vayamos creando.
1881
+
Es decir que si tenemos `#!python upload_to='covers'` esto crearía una carpeta `covers` en el raíz de nuestro proyecto con las imágenes (_portadas_) de los «posts» que vayamos creando.
Django nos ofrece la posibilidad de asignar a cada instancia de modelo una URL canónica[^4]. Para ello debemos implementar el método [`get_absolute_url`](https://docs.djangoproject.com/en/stable/ref/models/instances/#get-absolute-url).
2094
+
Django nos ofrece la posibilidad de asignar a cada instancia de modelo una URL canónica[^4]. Para ello debemos implementar el método [`get_absolute_url()`](https://docs.djangoproject.com/en/stable/ref/models/instances/#get-absolute-url).
2095
2095
2096
2096
Continuando con el <span class="example">ejemplo:material-flash:</span>del «post», podríamos definir su URL canónica de la siguiente manera:
1. La función [reverse](urls.md#reverse) ya nos devuelve la URL correspondiente.
2115
2115
2116
-
### Redirección de modelo { #model-redirect }
2116
+
### URL canónica en vistas { #canonical-url-in-views }
2117
2117
2118
2118
Además de las [redirecciones](urls.md#redirect) ya vistas, Django nos permite hacer una redirección sobre una instancia de un modelo. En ese caso se usará la URL canónica del objeto como URL de destino.
2119
2119
2120
-
Veamos un <span class="example">ejemplo:material-flash:</span>sobre un «post» del«blog»:
2120
+
Supongamos el típico <span class="example">ejemplo:material-flash:</span>en el que, después de dar de alta un «post» de un «blog» redirigimos al detalle de dicho «post»:
2121
2121
2122
-
```python title="posts/views.py"
2122
+
```python title="posts/views.py" hl_lines="11"
2123
2123
from django.shortcuts import redirect
2124
2124
2125
+
from .forms import AddPostForm
2125
2126
from .models import Post
2126
2127
2127
2128
2128
-
def post_detail(request, post_slug: str):
2129
-
# ...
2130
-
post= Post.objects.get(slug=post_slug)
2131
-
return redirect(post)#(1)!
2129
+
def add_post(request):
2130
+
if request.method =='POST':
2131
+
if (form := AddPostForm(request.POST)).is_valid():
1. - Django obtiene la URL llamando a [`post.get_absolute_url()`](models.md#canonical-url) y hace la redirección.
2136
2141
- En este caso se haría una redirección a `/posts/this-is-a-test-post/`.
2137
2142
2143
+
### URL canónica en plantillas { #canonical-url-in-templates }
2144
+
2145
+
Podemos reaprovechar el método `get_absolute_url()` para utilizarlo en plantillas. En el siguiente <span class="example">ejemplo:material-flash:</span> creamos un enlace a cada «post»:
1. En el contexto se fija el «post» que vamos a utilizar en la plantilla.
122
122
123
+
!!! note "Sin paréntesis"
124
+
125
+
Si queremos hacer uso de una función/método dentro de una plantilla, **no se ponen los paréntesis en la llamada**:
126
+
127
+
```htmldjango
128
+
<h2>post.title.upper</h2>
129
+
```
130
+
131
+
De aquí se deriva el hecho de que **no se pueden pasar parámetros** a funciones/métodos en plantillas. Para eso habría que hacer uso de [filtros](#filters).
132
+
123
133
## Etiquetas { #tags }
124
134
125
135
Django proporciona una serie de [etiquetas](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#built-in-tag-reference) para usar en plantillas. Estas etiquetas ofrecen distintas funcionalidades y se caracterizan por usar sintaxis `{% tag %}`.
0 commit comments