Skip to content

Commit 7be51d5

Browse files
committed
fences for forms
1 parent 634a522 commit 7be51d5

1 file changed

Lines changed: 44 additions & 44 deletions

File tree

bp/django_forms/README.md

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Precisamos criar um arquivo com este nome dentro da pasta `blog`.
1616

1717
Ok, vamos abri-lo e escrever nele o seguinte:
1818

19-
python
19+
``` python
2020
from django import forms
2121

2222
from .models import Post
@@ -25,7 +25,7 @@ Ok, vamos abri-lo e escrever nele o seguinte:
2525

2626
class Meta:
2727
model = Post
28-
fields = ('title', 'text',)
28+
fields = ('title', 'text',)```
2929

3030

3131
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
4444

4545
É hora de abrir `blog/templates/blog/base.html`. Nós iremos adicionar um link em `div` nomeado `page-header`:
4646

47-
html
47+
```html
4848
<a href="{% url 'blog.views.post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
49-
49+
```
5050

5151
Note que nós queremos chamar nossa nova visão `post_new`.
5252

5353
Depois de adicionar a linha, seu html deve se parecer com isso:
5454

55-
html
55+
```html
5656
{% load staticfiles %}
5757
<html>
5858
<head>
@@ -77,21 +77,21 @@ Depois de adicionar a linha, seu html deve se parecer com isso:
7777
</div>
7878
</body>
7979
</html>
80-
80+
```
8181

8282
Depois de salvar e recarregar a página `http://127.0.0.1:8000` você verá, obviamente, um erro familiar `NoReverseMatch` certo?
8383

8484
## URL
8585

8686
Vamos abrir o arquivo `blog/urls.py` e escrever:
8787

88-
python
88+
```python
8989
url(r'^post/new/$', views.post_new, name='post_new'),
90-
90+
```
9191

9292
O código final deve se parecer com isso:
9393

94-
python
94+
``` python
9595
from django.conf.urls import include, url
9696
from . mport views
9797

@@ -100,25 +100,25 @@ O código final deve se parecer com isso:
100100
url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail),
101101
url(r'^post/new/$', views.post_new, name='post_new'),
102102
]
103-
103+
```
104104

105105
Após recarregar o site, nós veremos um `AttributeError`, desde que nós não temos a visão `post_new` implementada. Vamos adicioná-la agora.
106106

107107
## post_new view
108108

109109
Hora de abrir o arquivo `blog/views.py` e adicionar as linhas seguintes com o resto das linhas `from`:
110110

111-
python
111+
``` python
112112
from .forms import PostForm
113-
113+
```
114114

115115
e nossa *view*:
116116

117-
python
117+
``` python
118118
def post_new(request):
119119
form = PostForm()
120120
return render(request, 'blog/post_edit.html', {'form': form})
121-
121+
```
122122

123123
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.
124124

@@ -129,15 +129,15 @@ Precisamos criar um arquivo `post_edit.html` na pasta `blog/templates/blog`. Pra
129129
* Temos que exibir o formulário. Podemos fazer isso simplesmente com um `{{ form.as_p }}`.
130130
* A linha acima precisa estar dentro de uma tag HTML form: `<form method="POST">...</form>`
131131
* 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:
133133

134134
![CSFR Página proíbida][1]
135135

136136
[1]: images/csrf2.png
137137

138138
Beleza, então vamos ver como ficou o HTML `post_edit.html`:
139139

140-
html
140+
```html
141141
{% extends 'blog/base.html' %}
142142

143143
{% block content %}
@@ -147,7 +147,7 @@ Beleza, então vamos ver como ficou o HTML `post_edit.html`:
147147
<button type="submit" class="save btn btn-default">Save</button>
148148
</form>
149149
{% endblock %}
150-
150+
```
151151

152152
Hora de atualizar! Há! Seu formulário apareceu!
153153

@@ -165,59 +165,59 @@ A resposta é: nada. Precisamos trabalhar um pouco mais na nossa *view*.
165165

166166
Abra `blog/views.py` mais uma vez. Atualmente tudo que temos na visão `post_new` é:
167167

168-
python
168+
``` python
169169
def post_new(request):
170170
form = PostForm()
171171
return render(request, 'blog/post_edit.html', {'form': form})
172-
172+
```
173173

174174
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).
175175

176176
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).
177177

178-
python
178+
``` python
179179
if request.method == "POST":
180180
[...]
181181
else:
182182
form = PostForm()
183-
183+
```
184184

185185
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:
186186

187-
python
187+
```python
188188
form = PostForm(request.POST)
189-
189+
```
190190

191191
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()`.
192192

193193
Verificamos se o formulário é válido e se estiver tudo certo, podemos salvá-lo!
194194

195-
python
195+
```python
196196
if form.is_valid():
197197
post = form.save(commit=False)
198198
post.author = request.user
199199
post.save()
200-
200+
```
201201

202202
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!
203203

204204
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:
205205

206-
python
206+
```python
207207
from django.shortcuts import redirect
208-
208+
```
209209

210210
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.
211211

212-
python
212+
```python
213213
return redirect('blog.views.post_detail', pk=post.pk)
214-
214+
```
215215

216216
`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.
217217

218218
Ok, nós falamos muito, mas provavelmente queremos ver o que toda a *view* irá parecer agora, certo?
219219

220-
python
220+
```python
221221
def post_new(request):
222222
if request.method == "POST":
223223
form = PostForm(request.POST)
@@ -229,7 +229,7 @@ Ok, nós falamos muito, mas provavelmente queremos ver o que toda a *view* irá
229229
else:
230230
form = PostForm()
231231
return render(request, 'blog/post_edit.html', {'form': form})
232-
232+
```
233233

234234
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`!
235235

@@ -261,13 +261,13 @@ Agora sabemos como adicionar um novo formulário. Mas e se quisermos editar um j
261261

262262
Abra `blog/templates/blog/post_detail.html` e adicione a linha:
263263

264-
python
265-
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
264+
```python
265+
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>```
266266

267267

268268
Agora o modelo estará parecido com:
269269

270-
html
270+
```html
271271
{% extends 'blog/base.html' %}
272272

273273
{% block content %}
@@ -279,20 +279,20 @@ Agora o modelo estará parecido com:
279279
</div>
280280
<h1>{{ post.title }}</h1>
281281
<p>{{ post.text|linebreaks }}</p>
282-
{% endblock %}
282+
{% endblock %}```
283283

284284

285285
Em `blog/urls.py` adicionamos esta linha:
286286

287-
python
287+
```python
288288
url(r'^post/(?P<pk>[0-9]+)/edit/$', views.post_edit, name='post_edit'),
289-
289+
```
290290

291291
Nós reutilizaremos o modelo `blog/templates/blog/post_edit.html`, então a última coisa que falta é uma *view*.
292292

293293
Vamos abrir `blog/views.py` e adicionar no final do arquivo:
294294

295-
ython
295+
```python
296296
def post_edit(request, pk):
297297
post = get_object_or_404(Post, pk=pk)
298298
if request.method == "POST":
@@ -305,19 +305,19 @@ Vamos abrir `blog/views.py` e adicionar no final do arquivo:
305305
else:
306306
form = PostForm(instance=post)
307307
return render(request, 'blog/post_edit.html', {'form': form})
308-
308+
```
309309

310310
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:
311311

312-
python
312+
```python
313313
form = PostForm(request.POST, instance=post)
314-
314+
```
315315

316316
como quando nós apenas abrimos um formulário com este post para editar:
317317

318-
python
318+
```python
319319
form = PostForm(instance=post)
320-
320+
```
321321

322322
Ok, vamos testar se funciona! Vamos para a página `post_detail`. Deve haver um botão editar no canto superior direito:
323323

@@ -354,4 +354,4 @@ Vamos ver se tudo isso funciona na PythonAnywhere. Tempo para outro deploy!
354354
[7]: https://www.pythonanywhere.com/consoles/
355355
[8]: https://www.pythonanywhere.com/web_app_setup/
356356

357-
E deve ser isso! Parabéns :)
357+
E deve ser isso! Parabéns :)

0 commit comments

Comments
 (0)