Skip to content

Commit 58f45b8

Browse files
committed
Fix minor issues
1 parent c414447 commit 58f45b8

File tree

2 files changed

+40
-13
lines changed

2 files changed

+40
-13
lines changed

docs/third-party/webdev/django/models.md

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1867,18 +1867,18 @@ class Post(models.Model):
18671867
slug = models.SlugField(unique=True, max_length=256)
18681868
content = models.TextField()
18691869
cover = models.ImageField(
1870-
uploads_to='covers',
1870+
upload_to='covers',
18711871
default='covers/nocover.png'
18721872
)
18731873
```
18741874

18751875
Analicemos cada parámetro de `ImageField` por separado:
18761876

1877-
=== "`uploads_to` :material-upload:"
1877+
=== "`upload_to` :material-upload:"
18781878

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.
18801880

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.
18821882

18831883
=== "`default` :material-book-arrow-left:"
18841884

@@ -2091,7 +2091,7 @@ class Post(models.Model):
20912091

20922092
<span class="djversion intermediate">:simple-django: Intermedio :material-tag-multiple-outline:</span>
20932093

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).
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).
20952095

20962096
Continuando con el <span class="example">ejemplo:material-flash:</span> del «post», podríamos definir su URL canónica de la siguiente manera:
20972097

@@ -2107,34 +2107,51 @@ class Post(models.Model):
21072107
content = models.TextField()
21082108

21092109
def get_absolute_url(self):
2110-
return reverse('posts:post-detail', kwargs={'slug': self.slug})#(1)!
2110+
return reverse('posts:post-detail', args=[self.slug])#(1)!
21112111
```
21122112
{ .annotate }
21132113

21142114
1. La función [reverse](urls.md#reverse) ya nos devuelve la URL correspondiente.
21152115

2116-
### Redirección de modelo { #model-redirect }
2116+
### URL canónica en vistas { #canonical-url-in-views }
21172117

21182118
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.
21192119

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»:
21212121

2122-
```python title="posts/views.py"
2122+
```python title="posts/views.py" hl_lines="11"
21232123
from django.shortcuts import redirect
21242124

2125+
from .forms import AddPostForm
21252126
from .models import Post
21262127

21272128

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():
2132+
post = form.save()
2133+
return redirect(post)#(1)!
2134+
else:
2135+
form = AddPostForm()
2136+
return render(request, 'posts/post/add.html', {'form': form})
21322137
```
21332138
{ .annotate }
21342139

21352140
1. - Django obtiene la URL llamando a [`post.get_absolute_url()`](models.md#canonical-url) y hace la redirección.
21362141
- En este caso se haría una redirección a `/posts/this-is-a-test-post/`.
21372142

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»:
2146+
2147+
```htmldjango title="posts/templates/posts/post/list.html" hl_lines="3"
2148+
{% for posts in posts %}
2149+
<div class="post">
2150+
<a href="{{ post.get_absolute_url }}">{{ post }}</a>
2151+
</div>
2152+
{% endfor %}
2153+
```
2154+
21382155
## Ordenación por defecto { #default-ordering }
21392156

21402157
<span class="djversion intermediate">:simple-django: Intermedio :material-tag-multiple-outline:</span>

docs/third-party/webdev/django/templates.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ def post_detail(request, post_slug: str):
120120

121121
1. En el contexto se fija el «post» que vamos a utilizar en la plantilla.
122122

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+
123133
## Etiquetas { #tags }
124134

125135
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

Comments
 (0)