+{{ meu_artigo.conteudo }}
+Reporter: {{ meu_artigo.user.name }}
+Published: {{ meu_artigo.data_publicacao|date }}
+``` + +### ListView + +Uma página que representa uma lista de objetos. +Enquanto essa view está executando a variável ``self.object_list`` vai conter +a lista de objetos que a view está utilizando. + +O fluxo básico de execução dessa classe quando recebe +uma requisição é: + +1. ``dispatch()`` +2. ``http_method_not_allowed()`` +3. ``get_template_names()`` +5. ``get_queryset()`` +6. ``get_object()`` +7. ``get_context_object_name()`` +8. ``get_context_data()`` +9. ``get()`` +10. ``render_to_response()`` + +Nada de novo aqui certo? Podemos exibir apenas uma lista de Artigos que estão +com ``status='publicado'`` + +```python + +from django.views.generic.list import ListView +from django.utils import timezone + +from articles.models import Artigo + +class ArticleListView(ListView): + + model = Artigo + + def get_queryset(self, **kwargs): + return Artigo.objects.filter(status='publicado') +``` + +Outra opção seria: + +```python + +from django.views.generic.list import ListView +from django.utils import timezone + +from articles.models import Artigo + +class ArticleListView(ListView): + + model = Artigo + queryset = Artigo.objects.filter(status='publicado') +``` + +**artigo_list.html** +```html ++ {% if previous_month %} + Previous Month: {{ previous_month|date:"F Y" }} + {% endif %} + {% if next_month %} + Next Month: {{ next_month|date:"F Y" }} + {% endif %} +
+``` + +### WeekArchiveView + +Uma página para exibir um arquivo semanal. Retorna todos os objetos de uma +determinada semana. + +No contexto além da lista de objetos temos ainda: + +- ``week``: Um objeto datetime.datetime representando a semana atual +- ``next_week``: Um objeto datetime.datetime representando a próxima semana +- ``previous_week``: Um objeto datetime.datetime representando a semana anterior + +Implementação simples: + +**views.py** +```python +from django.views.generic.dates import WeekArchiveView + +from myapp.models import Article + +class ArticleWeekArchiveView(WeekArchiveView): + queryset = Article.objects.all() + date_field = "pub_date" + week_format = "%W" + allow_future = True +``` + +**urls.py** +```python +from django.conf.urls import url + +from myapp.views import ArticleWeekArchiveView + +urlpatterns = [ + # Example: /2012/week/23/ + url(r'^(?P+ {% if previous_week %} + Previous Week: {{ previous_week|date:"F Y" }} + {% endif %} + {% if previous_week and next_week %}--{% endif %} + {% if next_week %} + Next week: {{ next_week|date:"F Y" }} + {% endif %} +
+``` + +### DayArchiveView + +Uma página para exibir um arquivo diário. Retorna todos os objetos de um +determinado dia. + +No contexto além da lista de objetos temos ainda: + +- ``day``: Um objeto datetime.datetime representando o dia atual +- ``next_day``: Um objeto datetime.datetime representando o próximo dia +- ``previous_day``: Um objeto datetime.datetime representando o dia anterior +- ``next_month``: Um objeto datetime.datetime representando o primeiro dia do + próximo mês +- ``previous_month``: Um objeto datetime.datetime representando o primeiro dia + do mês anterior + +Implementação simples: + +**views.py** +```python +from django.views.generic.dates import DayArchiveView + +from myapp.models import Article + +class ArticleDayArchiveView(DayArchiveView): + queryset = Article.objects.all() + date_field = "pub_date" + allow_future = True +``` + +**urls.py** +```python +from django.conf.urls import url + +from myapp.views import ArticleDayArchiveView + +urlpatterns = [ + # Example: /2012/nov/10/ + url(r'^(?P+ {% if previous_day %} + Previous Day: {{ previous_day }} + {% endif %} + {% if previous_day and next_day %}--{% endif %} + {% if next_day %} + Next Day: {{ next_day }} + {% endif %} +
+``` + +### TodayArchiveView + +É a mesma coisa do ``DayArchiveView`` mas não usa os parâmetros da URL para +determinar o ano/mês/dia. + +O que muda é o urls.py, veja o exemplo abaixo: + +```python +from django.conf.urls import url + +from myapp.views import ArticleTodayArchiveView + +urlpatterns = [ + url(r'^today/$', + ArticleTodayArchiveView.as_view(), + name="archive_today"), +] +``` + +### DateDetailView + +É a mesma coisa que a ``DetailView`` com a diferença que a data é utilizada +junto com o pk/slug para determinar qual objeto deve ser obtido. + +O que muda é o urls.py, veja o exemplo abaixo: + +```python +from django.conf.urls import url +from django.views.generic.dates import DateDetailView + +urlpatterns = [ + url(r'^(?P| Nome | +CPF | +Idade | +Telefone | +Criado em | +|
|---|---|---|---|---|---|
| {{ nome.nome }} | +{{ nome.cpf }} | +{{ nome.idade }} | +{{ nome.email }} | +{{ nome.telefone }} | +{{ nome.criado_em|date:"d/m/Y" }} | +
+
+### O que aconteceu?
+
+Temos uma lista de dicionários desordenado e queremos ordenar de acordo com os parâmetros que queremos. Com isso, utilizamos duas bibliotecas que já estão por padrão com o Python: *[operator](https://docs.python.org/2/library/operator.html?highlight=itemgetter#operator.itemgetter) e [pprint](https://docs.python.org/2/library/pprint.html)*.
+
+Dentro da biblioteca **operator** temos a funcionalidade **itemgetter**, onde através dos parâmetros que passamos, ele irá fazer a seleção. Já o **pprint** irá mostrar o resultado da nossa seleção de forma mais bonita. Vamos explicar detalhadamente o que cada coisa faz.
+
+Criamos nossa lista de dicionários:
+
+```python
+>>> colunas = [
+... {'pnome': 'Eric', 'unome': 'Hideki', 'id': 4},
+... {'pnome': 'Luciano', 'unome': 'Ramalho', 'id': 2},
+... {'pnome': 'David', 'unome': 'Beazley', 'id': 8},
+... {'pnome': 'Tim', 'unome': 'Peters', 'id': 1},
+... ]
+```
+
+Importamos a biblioteca operator e sua funcionalidade itemgetter:
+
+```python
+>>>from operator import itemgetter
+```
+
+E criamos nossa funcionalidade para ordenar a lista de dicionários de acordo com o parâmetro selecionado, que nesse caso será o primeiro nome, o **pname**:
+
+```python
+>>> colunas_por_nome = sorted(colunas, key=itemgetter('pnome'))
+```
+
+Finalizando, utilizamos o **pprint** para exibir o resultado:
+
+```python
+>>>pprint(colunas_por_nome)
+```
+
+Bacana, né? E também utilizamos a mesma lógica para ordenar de acordo com o **id**.
+
+Se quiser saber mais a respeito do Ipython, indico o artigo do [Python Help que fala a respeito](https://pythonhelp.wordpress.com/2011/02/22/dreampie-o-shell-python-que-voce-sempre-sonhou/).
+
+# [Python Tutor](http://www.pythontutor.com/)
+
+Ao observarmos uma funcionalidade queremos entender o que ele faz, e muitas vezes o que cada coisa no código faz não fica muito bem claro em nossas ideias. Por isso o Python Tutor existe! Ele exibe passo-a-passo o que está acontecendo no código.
+
+
+
+Clique em **Forward** e veja o que acontece.
+
+# Outras opções
+
+Também existem outras ferramentas que podem auxiliar e melhorar seu código:
+
+- **Anaconda para Sublime Text** - [http://damnwidget.github.io/anaconda/](http://damnwidget.github.io/anaconda/)
+- **Autopep8** - [https://pypi.python.org/pypi/autopep8](https://pypi.python.org/pypi/autopep8)
+- **Jedi** - [https://github.com/davidhalter/jedi](https://github.com/davidhalter/jedi)
+- **Pyflakes** - [https://pypi.python.org/pypi/pyflakes](https://pypi.python.org/pypi/pyflakes)
+- **PDB** - [https://docs.python.org/2/library/pdb.html](https://docs.python.org/2/library/pdb.html)
+
+## Locais onde podemos postar nossas dúvidas
+
+Vale sempre lembrar que é muito importante consultar a documentação oficial do Python, seja a [versão 2](https://docs.python.org/2/) ou a [versão 3](https://docs.python.org/3/).
+
+Também existem outro lugar muito legal, o **[Stackoverflow](http://pt.stackoverflow.com/)**. Se ainda o problema persistir, acesse as listas de discussões da comunidade Python no Brasil.
+
+- **Python Brasil** - [https://groups.google.com/forum/#!forum/python-brasil](https://groups.google.com/forum/#!forum/python-brasil)
+- **Django Brasil** - [https://groups.google.com/forum/#!forum/django-brasil](https://groups.google.com/forum/#!forum/django-brasil)
+- **Web2py Brasil** - [https://groups.google.com/forum/#!forum/web2py-users-brazil](https://groups.google.com/forum/#!forum/web2py-users-brazil)
+- **Flask Brasil** - [https://groups.google.com/forum/#!forum/flask-brasil](https://groups.google.com/forum/#!forum/flask-brasil)
+- **Comunidades locais da comunidade Python ao redor do Brasil** - [http://pythonbrasil.github.io/wiki/comunidades-locais](http://pythonbrasil.github.io/wiki/comunidades-locais)
+
+Deixe nos comentários seu feedback, e se tiver outra dica que não foi citado, não deixe de indicar.
diff --git a/content/como_colaborar_com_projetos_open_source_sem_saber_programar.rst b/content/como_colaborar_com_projetos_open_source_sem_saber_programar.rst
index c772b7171..c9d76f7b5 100644
--- a/content/como_colaborar_com_projetos_open_source_sem_saber_programar.rst
+++ b/content/como_colaborar_com_projetos_open_source_sem_saber_programar.rst
@@ -7,6 +7,9 @@ Como colaborar na tradução do Djangobook sem conhecer programação
:slug: como_colaborar_com_projetos_open_source
:author: Eric Hideki
:email: eric8197@gmail.com
+:site: http://ericstk.wordpress.com/
+:twitter: erichideki
+
Uma das perguntas que os iniciantes sempre se perguntam é: Como ganhar experiência? Ou colaborar com projetos open source sem ter conhecimentos? Pois é, saiba que você pode colaborar sem dificuldades, e que
@@ -30,4 +33,4 @@ Depois temos a seção abaixo escrito Propose file change, nele podemos colocar
Na parte inferior estará demonstrando algumas linhas de código em vermelho e verde, respectivamente. Nas linhas vermelhas estão os arquivos que serão deletados, já os de cor verde serão os substitutos. E agora basta enviar um ``Pull Request``.
-Pronto. Você acaba de encaminhar uma proposta de melhoria de um projeto, basta o mantenedor observar suas alterações, se estiver de acordo com os padrões de qualidade ele irá dar um ``Merge`` com o antigo código e pronto.
\ No newline at end of file
+Pronto. Você acaba de encaminhar uma proposta de melhoria de um projeto, basta o mantenedor observar suas alterações, se estiver de acordo com os padrões de qualidade ele irá dar um ``Merge`` com o antigo código e pronto.
diff --git a/content/configurando-ambiente-django-com-apache-e-mod-wsgi.md b/content/configurando-ambiente-django-com-apache-e-mod-wsgi.md
new file mode 100644
index 000000000..06ab38919
--- /dev/null
+++ b/content/configurando-ambiente-django-com-apache-e-mod-wsgi.md
@@ -0,0 +1,269 @@
+Title: Configurando ambiente Django com Apache e mod_wsgi
+Date: 2015-03-02 00:20
+Tags: python, django, apache, mod_wsgi, virtualenv, virtualenvwrapper
+Category: Django
+Slug: configurando-ambiente-django-com-apache-e-mod-wsgi
+Author: Guilherme Louro
+Email: guilherme-louro@hotmail.com
+Github: guilouro
+Twitter: guilhermelouro
+Facebook: guilherme.louro.3
+
+
+### Entendendo a necessidade
+
+Muitas vezes encontramos dificuldade em colocar nossas aplicações para funcionar em um servidor devido ao pouco conhecimento em infraestrutura, principalmente aqueles que vieram do php, onde, subir um site e já o ver funcionando no ambiente final se trata apenas de subir os arquivos para a pasta **www** e pronto, certo? Não, não é bem por aí ...
+
+Normalmente quando configuramos a hospedagem de um domínio através de um software de gestão de alojamento web *([cpanel](http://cpanel.net) é o mais conhecido)* automaticamente o sistema configura o VirtualHost específico para o seu domínio cadastrado, ja direcionando a path para a sua pasta *www* ou **public_html**. Mas como isso é feito? Não entrarei em detalhes de como o cpanel funciona, mas irei demonstrar aqui como configuramos um servidor com [apache](http://httpd.apache.org/docs/) para receber nossa aplicação.
+
+### Mas por que o Apache?
+
+A partir do momento que eu mudei meu foco, saindo do PHP para trabalhar com **Python**, eu acabei "abandonando" o Apache para trabalhar com Nginx. Porém, me deparei com um projeto onde tinha que funcionar em uma Hospedagem compartilhada na qual só funciona o apache. Como não vi nada relacionado a essa configuração aqui no **Pythonclub**, achei que seria útil para muitos que podem cair em uma situação parecida com a minha, ou simplesmente prefira usar o Apache do que o Nginx.
+
+Caso o seu interesse seja mesmo usar o Nginx
+
+
+Nenhum comentário novo
+ {% else %} +
+