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
Como antes, cconfira a ordem e coloque antes do link para `blog/static/css/blog.css`. Essa linha irá importar uma fonte chamada *Lobster* do Google Fonts (https://www.google.com/fonts).
157
+
Como antes, confira a ordem e coloque antes do link para `blog/static/css/blog.css`. Essa linha irá importar uma fonte chamada *Lobster* do Google Fonts (https://www.google.com/fonts).
158
158
159
-
Encontre o bloco com a declaração `h1 a` (o código entre chaves `{`and`}`) dentro do arquivo CSS `blog/static/css/blog.css`. Agora adicione a linha `font-family: 'Lobster';` entre as chaves, e atualize a página:
159
+
Encontre o bloco com a declaração `h1 a` (o código entre chaves `{`e`}`) dentro do arquivo CSS `blog/static/css/blog.css`. Agora adicione a linha `font-family: 'Lobster';` entre as chaves, e atualize a página:
160
160
161
161
162
162
Agora adicione a linha `font-family: 'Lobster';` no CSS do arquivo `static/css/blog.css` dentro do bloco de declaração `h1 a` (o código entre as chaves `{` e `}`) e atualize a página:
@@ -173,7 +173,7 @@ h1 a {
173
173
174
174
Incrível!
175
175
176
-
Como mencionado acima, CSS usa o conceito de classes, que basicamente permite que você nomeie parte do código HTML e aplique estilos apenas à esta parte, sem afetar as outras. É super útil se você tiver duas divs, mas eles estão fazendo algo muito diferente (como o seu cabeçalho e seu post). Uma classe pode ajudar você a fazer com que eles tenham um visual diferente.
176
+
Como mencionado acima, CSS usa o conceito de classes, que basicamente permite que você nomeie parte do código HTML e aplique estilos apenas à esta parte, sem afetar as outras. É super útil! Talvez você tenha duas `div`s que estão fazendo algo muito diferente (como o seu cabeçalho e seu post). A classe pode ajudar você a fazer com que eles tenham um visual diferente.
177
177
178
178
Vá em frente e o nomeie algumas partes do código HTML. Adicione uma classe chamada de `page-header` para o `div` que contém o cabeçalho, assim:
179
179
@@ -286,7 +286,7 @@ Salve esses arquivos e atualize seu site.
286
286
287
287

288
288
289
-
Uhuu! Ficou incrível, né? Olhe para o código que nós acabamos de colar para encontrar os lugares aonde nós adicionamos classes no HTML e as usamos no CSS. Aonde você faria a mudança para que a data ficasse com a cor turquesa?
289
+
Uhuu! Ficou incrível, né? Olhe para o código que nós acabamos de colar para encontrar os lugares aonde nós adicionamos classes no HTML e as usamos no CSS. Aonde você faria a mudança para que a data ficasse com a cor turquesa?
290
290
291
291
Não tenha medo de brincar com esse CSS um pouco e tente mudar algumas coisas. Brincar com o CSS pode ajudar você a entender as
292
292
diferentes coisas que estão sendo feitas. Se você bagunçar tudo, não se preocupe - você sempre pode voltar atrás!
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 uma "postagem" 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).
179
+
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 uma "postagem" 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).
180
180
181
-
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).
181
+
Então, na nossa *view*, nós temos duas situações separadas para lidar. A primeira é quando 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).
182
182
183
183
{% filename %}blog/views.py{% endfilename %}
184
184
```python
@@ -188,14 +188,14 @@ else:
188
188
form = PostForm()
189
189
```
190
190
191
-
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:
191
+
Está na hora de preencher os pontos`[...]`. Se `method` é `POST` então nós queremos construir o `PostForm` com os dados que vêm do formulário, certo? Nós iremos fazer assim:
192
192
193
193
{% filename %}blog/views.py{% endfilename %}
194
194
```python
195
195
form = PostForm(request.POST)
196
196
```
197
197
198
-
Fácil! A próxima coisa é verificar se o formulário está correto(todos os campos requeridos estão definidos e nenhum valor incorreto foi enviado). Fazemos isso com `form.is_valid()`.
198
+
Fácil! A próxima coisa é verificar se o formulário está correto(todos os campos requeridos estão definidos e nenhum valor incorreto foi enviado). Fazemos isso com `form.is_valid()`.
199
199
200
200
Verificamos se o formulário é válido e se estiver tudo certo, podemos salvá-lo!
201
201
@@ -208,7 +208,7 @@ if form.is_valid():
208
208
post.save()
209
209
```
210
210
211
-
Basicamente, temos duas coisas aqui: salvamos o formulário com `form.save` e adicionados um autor(já que não tinha 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 o autor) e será criada uma nova postagem no blog!
211
+
Basicamente, temos duas coisas aqui: salvamos o formulário com `form.save` e adicionados um autor(já que não tinha 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 o autor) e será criada uma nova postagem no blog!
212
212
213
213
Finalmente, seria fantástico se nós pudéssemos imediatamente ir à página `post_detail` da nossa recém-criada postagem no blog, certo? Para fazer isso nós precisamos fazer mais um import:
Copy file name to clipboardExpand all lines: pt/domain/README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -46,7 +46,7 @@ Pode levar alguns minutos para o seu domínio funcionar, então seja paciente!
46
46
47
47
## Configure o domínio através de um web app na PythonAnywhere.
48
48
49
-
Você também precisa dizer PythonAnywhere que você deseja usar o seu domínio personalizado.
49
+
Você também precisa dizer para o PythonAnywhere que você deseja usar o seu domínio personalizado.
50
50
51
51
Vá para a [página PythonAnywhere contas][7] e atualize sua conta. A opção mais barata (um plano de "Hacker") é bom para começar, você pode sempre atualizá-lo mais tarde quando você ficar super famosa e tiver milhões de acessos.
Copy file name to clipboardExpand all lines: pt/extend_your_application/README.md
+18-2Lines changed: 18 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -150,7 +150,7 @@ Será algo parecido com isto:
150
150
{% endblock %}
151
151
```
152
152
153
-
Mais uma vez estamos estendendo `base.html`. No bloco `content` queremos exibir o published_date (data de publicação) da postagem (se houver), título e texto. Mas devemos discutir algumas coisas importantes, certo?
153
+
Mais uma vez estamos estendendo `base.html`. No bloco `content` queremos exibir o `published_date` (data de publicação) da postagem (se houver), título e texto. Mas devemos discutir algumas coisas importantes, certo?
154
154
155
155
{% raw %}`{%if...%} ... {% endif %}` é uma tag de template que podemos usar quando queremos verificar algo (Lembra do `if...else...` do **capítulo introdução ao Python**?). Neste cenário, queremos verificar se `published_date` de uma postagem não está vazia.{% endraw %}
156
156
@@ -160,7 +160,7 @@ Ok, podemos atualizar nossa página e ver se o `TemplateDoesNotExist`já se foi
160
160
161
161
Yay! Funciona!
162
162
163
-
## Mais uma coisa: hora de implantar!
163
+
# Mais uma coisa: hora de implantar!
164
164
165
165
Seria bom ver se seu site ainda estará trabalhando em PythonAnywhere, certo? Vamos tentar fazer deploy novamente.
166
166
@@ -182,6 +182,22 @@ $ git pull
182
182
[...]
183
183
```
184
184
185
+
## Atualizando os arquivos estáticos no servidor
186
+
187
+
Servidores como PythonAnywhere gostam de tratar "arquivos estáticos" (como arquivos CSS) de maneira diferente dos arquivos Python, porque eles podem otimizá-los para que sejam carregados mais rapidamente. Como resultado, sempre que fazemos mudanças nos nossos arquivos de CSS, precisamos executar um comando extra no servidor para informá-los para atualizá-los. O comando é chamado `collectstatic`.
188
+
189
+
Comece inicializando seu ambiente virtual, se não tiver inicializado anteriormente (PythonAnywhere usa um comando chamado `workon` para fazer isso, é como o comando `source myenv/bin/activate` que você usa no seu próprio computador):
O comando `manage.py collecstatic` é um pouco parecido com `manage.py migrate`. Fazemos alterações em nosso código e, em seguida, informamos o Django para _aplicar_ essas alterações, seja para a coleção do servidor de arquivos estáticos, seja para o banco de dados.
199
+
200
+
185
201
E finalmente, pule para a [tab Web](https://www.pythonanywhere.com/web_app_setup/) e aperte **Reload**.
Copy file name to clipboardExpand all lines: pt/template_extending/README.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -118,7 +118,7 @@ Hora de adicionar tags de bloco ("block") nesse arquivo!
118
118
{% endblock %}
119
119
```
120
120
121
-
Só falta uma coisa. Nós precisamos fazer a conexão entre esses dois templates. É isso que "extendendo templates" significa! Nós iremos fazer isso adicionando uma tag de extender ("extends") ao início do arquivo. Dessa forma:
121
+
Só falta uma coisa. Nós precisamos fazer a conexão entre esses dois templates. É isso que "extendendo templates" significa! Nós iremos fazer isso adicionando uma tag de estender ("extends") ao início do arquivo. Dessa forma:
@@ -139,4 +139,4 @@ Só falta uma coisa. Nós precisamos fazer a conexão entre esses dois templates
139
139
140
140
É isso! Veja se o seu site ainda está funcionando direito :)
141
141
142
-
> Se ocorrer um erro de `TemplateDoesNotExists`, que diz que não existe nenhum arquivo chamado `blog/base.html` e se você tiver o `runserver` executando no terminal, tenta interrompê-lo (precionando Ctrl+C - o botão Control mais o botão C juntos) e reinicie ele rodando o comando `python manage.py runserver`.
142
+
> Se ocorrer um erro de `TemplateDoesNotExists`, que diz que não existe nenhum arquivo chamado `blog/base.html` e se você tiver o `runserver` executando no terminal, tente interrompê-lo (precionando Ctrl+C - o botão Control mais o botão C juntos) e reinicie ele rodando o comando `python manage.py runserver`.
0 commit comments