Criando uma landing page com o Django

“Tutorial” explicando como organizar seus arquivos/apps e criar uma landing page simples com Django.

OBSERVAÇÃO IMPORTANTE: Todas as informações nesse post foram retiradas através das interações ocorridas no curso Welcome to the Django, ministrado pelo Henrique Bastos.

Ok, temos nosso projeto com o código django já configurado. Agora, onde vai meu código?

Temos a seguinte estrutura de pastas:

.
├── manage.py
└── project_name
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Para começarmos a programar algo no Django, precisamos incluir uma APP. Segundo o site do Django:

What’s the difference between a project and an app? An app is a Web application that does something – e.g., a Weblog system, a database of public records or a simple poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.

Ou seja, uma APP é onde seu código vive. Mas não pense seu sistema em APPs. Comece seu projeto de forma simples, e vá extraindo código para APPs específicas conforme o código for crescendo. Naturalmente o código irá começar a apresentar diferenças e especificidades, “pedindo” naturalmente para ser extraído para uma outra APP.

Seguindo esse conselho, criamos sempre uma APP core! Ela terá todo núcleo do código do projeto. Conforme o código for evoluindo, as funcionalidades do core começam a ser extraídas para novas APPs. Neste core estarão configurações, templates, layouts, models, etc. Tudo que servirá como “base” para o projeto.

Então, para criar nossa primeira app:

$ cd project_name
$ manage startapp core
# ou python ../manage.py startapp core

A estrutura de pastas ficará assim:

.
├── manage.py
└── project_name
    ├── core
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Inicialmente, todas as apps serão organizadas dentro do projeto Django (pasta project_name). Caso o número de apps cresça muito (e somente nesse caso), podemos criar uma pasta apps para conter todas elas. Mas somente pensaremos nessa opção e como fazer para organizar quando isso for necessário.

Após gerar a app core, devemos “instalá-la” no projeto Django. Para isso, vamos até o arquivo settings.py e ajustar a variável INSTALLED_APPS, acrescentando o seguinte código:

INSTALLED_APPS = (
    # ...
    'project_name.core',
)

Agora, vamos criar uma view, que tem como responsabilidade receber um request, orquestrar os dados, e devolver um response. No arquivo core/views.py, digite o seguinte código:

from django.shortcuts import render

def home(request):
    context_dict = None
    return render(request, 'index.html', context_dict)

O context_dict não é importante aqui, deixei ele somente para mostrar que é possível passar dados para o template a ser renderizado.

Para que essa view seja renderizada corretamente, é necessário criar o arquivo index.html. Ele deve ser criado em core/templates/index.html (Fique livre para colocar o código HTML que você preferir, pode ser um texto simples também).

Para utilização dos arquivos estáticos (css, imagens, etc) nos templates:


# Carrega as template tags
{% load static %}
 
# Adiciona um arquivo estático no template
{% static 'folder/file' %}
 
# Regex para ajustar caminhos "hard-coded"
(src|href)="((img|css|js).*?)" 
# PARA
$1="{% static '$2' %}"

Agora falta criarmos a rota expondo a view. Para isso, no arquivo urls.py, adicionar o seguinte código:

from project_name.core.views import home
 
urlpatterns = [
    url(r'^$', home, name='home'),
    # ...
]

Caso o arquivo de urls comece a descer ou tenha muitas urls semelhantes de uma única app, podemos quebrar esse arquivo, e criar, dentro da app core um arquivo urls.py. Mantendo assim:

# urls.py do project_name
urlpatterns = [
    # ...
    url(r'^homepage/',
        include('project_name.core.urls',
        namespace='core')),
    # ...
]
 
# urls.py do core
from project_name.core.views import home
 
urlpatterns = [
    url(r'^$', home, name='home'),
]

Dessa forma, a view home estará exposta em /homepage/.

Obs.: A url no include pode muito bem ser especificado como “vazia” (r'^'). Desta forma, a url exposta para a view home seria apenas /

Written on February 4, 2016