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
Copy file name to clipboardExpand all lines: bp/django_forms/README.md
+44-44Lines changed: 44 additions & 44 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,7 +16,7 @@ Precisamos criar um arquivo com este nome dentro da pasta `blog`.
16
16
17
17
Ok, vamos abri-lo e escrever nele o seguinte:
18
18
19
-
python
19
+
```python
20
20
from django import forms
21
21
22
22
from .models import Post
@@ -25,7 +25,7 @@ Ok, vamos abri-lo e escrever nele o seguinte:
25
25
26
26
classMeta:
27
27
model = Post
28
-
fields = ('title', 'text',)
28
+
fields = ('title', 'text',)```
29
29
30
30
31
31
Primeiro precisamos importar o módulo de formulários do Django (`from django import forms`) e, obviamente, nosso modelo `Post` (`from .models import Post`).
@@ -44,15 +44,15 @@ Então, mais uma vez, nós iremos criar: um link para a página, uma URL, uma vi
44
44
45
45
É hora de abrir `blog/templates/blog/base.html`. Nós iremos adicionar um link em `div` nomeado `page-header`:
Para criar um novo formulario `Post`, nós devemos chamar `PostForm()` e passá-lo para o template. Nós iremos voltar para esta *view*, mas por agora vamos criar rapidamente um template para o formulário.
124
124
@@ -129,15 +129,15 @@ Precisamos criar um arquivo `post_edit.html` na pasta `blog/templates/blog`. Pra
129
129
* Temos que exibir o formulário. Podemos fazer isso simplesmente com um `{{ form.as_p }}`.
130
130
* A linha acima precisa estar dentro de uma tag HTML form: `<form method="POST">...</form>`
131
131
* Precisamos de um botão `Salvar`. Fazemos isso com um botão HTML: `<button type="submit">Save</button>`
132
-
* E finalmente, depois de abrir a tag `<form ...>` precisamos adicionar um `{% csrf_token %}`. Isso é muito importante, pois é isso que faz o nosso formulário ficar seguro! O DJango vai reclamar se você esquecer de adicionar isso e simplesmente salvar o formulário:
132
+
* E finalmente, depois de abrir a tag `<form ...>` precisamos adicionar um `{% raw %}{% csrf_token %}{endraw}`. Isso é muito importante, pois é isso que faz o nosso formulário ficar seguro! O DJango vai reclamar se você esquecer de adicionar isso e simplesmente salvar o formulário:
133
133
134
134
![CSFR Página proíbida][1]
135
135
136
136
[1]: images/csrf2.png
137
137
138
138
Beleza, então vamos ver como ficou o HTML `post_edit.html`:
139
139
140
-
html
140
+
```html
141
141
{% extends 'blog/base.html' %}
142
142
143
143
{% block content %}
@@ -147,7 +147,7 @@ Beleza, então vamos ver como ficou o HTML `post_edit.html`:
Quando nós enviamos o formulário, somos trazidos de volta para a mesma visão, mas desta vez temos mais alguns dados no `request`, mais especificamente em `request.POST` (o nome não tem nada com "post" de blog , tem a ver com o fato de que estamos "postando" dados). Você se lembra que no arquivo HTML nossa definição de ` <form> ` tem a variável `method="POST"`? Todos os campos vindos do "form" estarão disponíveis agora em `request.POST`. Você não deveria renomear `POST` para nada diferente disso (o único outro valor válido para `method` é `GET`, mas nós não temos tempo para explicar qual é a diferença).
175
175
176
176
Então na nossa *view* nós temos duas situações separadas para lidar. A primeira é quanto acessamos a página pela primeira vez e queremos um formulário em branco. E a segunda, é quando nós temos que voltar para a *view* com todos os dados do formulário que nós digitamos. Desse modo, precisamos adicionar uma condição (usaremos `if` para isso).
177
177
178
-
python
178
+
```python
179
179
if request.method =="POST":
180
180
[...]
181
181
else:
182
182
form = PostForm()
183
-
183
+
```
184
184
185
185
Está na hora de preencher os pontos`[...]`. Se `method` é `POST` então nós queremos construir o `PostForm` com os dados que veem do formulário, certo? Nós iremos fazer assim:
186
186
187
-
python
187
+
```python
188
188
form = PostForm(request.POST)
189
-
189
+
```
190
190
191
191
Fácil! Próxima coisa é verificar se o formulário está correto(todos os campos requeridos são definidos e valores incorretos não serão salvos). Fazemos isso com `form.is_valid()`.
192
192
193
193
Verificamos se o formulário é válido e se estiver tudo certo, podemos salvá-lo!
194
194
195
-
python
195
+
```python
196
196
if form.is_valid():
197
197
post = form.save(commit=False)
198
198
post.author = request.user
199
199
post.save()
200
-
200
+
```
201
201
202
202
Basicamente, temos duas coisas aqui: Salvamos o formulário com `form.save` e adicionados um autor(desde que não haja o campo `author` em `PostForm`, e este campo é obrigatório!). `commit=False` significa que não queremos salvar o modelo `Post` ainda - queremos adicionar autor primeiro. Na maioria das vezes você irá usar `form.save()`, sem `commit=False`, mas neste caso, precisamos fazer isso. `post.save()` irá preservar as alterações(adicionando autor) e é criado um novo post no blog!
203
203
204
204
Finalmente, não seria fantástico se nós pudéssemos imediatamente ir à página de `post_detail` para o recém-criado blog post, certo? Para fazer isso nós precisaremos de mais uma importação:
205
205
206
-
python
206
+
```python
207
207
from django.shortcuts import redirect
208
-
208
+
```
209
209
210
210
Adicione-o logo no início do seu arquivo. E agora podemos dizer: vá para a página `post_detail` para um recém-criado post.
`blog.views.post_detail` é o nome da view que queremos ir. Lembre-se que essa *view* exige uma variável `pk`? Para passar isso nas `views` usamos `pk=post.pk`, onde post é o recém-criado blog post.
217
217
218
218
Ok, nós falamos muito, mas provavelmente queremos ver o que toda a *view* irá parecer agora, certo?
219
219
220
-
python
220
+
```python
221
221
defpost_new(request):
222
222
if request.method =="POST":
223
223
form = PostForm(request.POST)
@@ -229,7 +229,7 @@ Ok, nós falamos muito, mas provavelmente queremos ver o que toda a *view* irá
Vamos ver se funciona. Vá para o página http://127.0.0.1:8000/post/novo /, adicione um `title` e o `text`, salve... e voilà! O novo blog post é adicionado e nós somos redirecionados para a página de `post_detail`!
235
235
@@ -261,13 +261,13 @@ Agora sabemos como adicionar um novo formulário. Mas e se quisermos editar um j
261
261
262
262
Abra `blog/templates/blog/post_detail.html` e adicione a linha:
Isso é quase exatamente igual a nossa view de `post_new`, certo? Mas não totalmente. Primeira coisa: passamos um parâmetro extra da url `pk`. Em seguida: pegamos o modelo `Post` que queremos editar com `get_object_or_404 (Post, pk=pk)` e então, quando criamos um formulário passamos este post como uma `instância`, tanto quando salvamos o formulário:
311
311
312
-
python
312
+
```python
313
313
form = PostForm(request.POST, instance=post)
314
-
314
+
```
315
315
316
316
como quando nós apenas abrimos um formulário com este post para editar:
317
317
318
-
python
318
+
```python
319
319
form = PostForm(instance=post)
320
-
320
+
```
321
321
322
322
Ok, vamos testar se funciona! Vamos para a página `post_detail`. Deve haver um botão editar no canto superior direito:
323
323
@@ -354,4 +354,4 @@ Vamos ver se tudo isso funciona na PythonAnywhere. Tempo para outro deploy!
0 commit comments