---
title: "Primeiro Projeto Django: Guia Completo"
url: "https://python.dev.br/guias/primeiro-projeto-django/"
markdown_url: "https://python.dev.br/guias/primeiro-projeto-django.MD"
description: "Crie seu primeiro projeto Django do zero. Aprenda a instalar, configurar, criar modelos, views, templates e rodar o servidor de desenvolvimento"
date: "2025-11-12"
author: ""
---

# Primeiro Projeto Django: Guia Completo

Crie seu primeiro projeto Django do zero. Aprenda a instalar, configurar, criar modelos, views, templates e rodar o servidor de desenvolvimento


## Introdução

Django é o framework web mais popular do Python. Usado por empresas como Instagram, Pinterest e Disqus, ele segue a filosofia "baterias incluídas" — oferecendo ORM, sistema de autenticação, painel administrativo e muito mais prontos para uso.

Neste guia, vamos criar um projeto Django completo do zero: uma aplicação simples de lista de tarefas. Ao final, você terá um projeto funcional rodando no seu computador.

## Pré-requisitos

Antes de começar, certifique-se de ter:

- Python 3.10 ou superior instalado
- Conhecimento básico de terminal/linha de comando
- Um editor de código (VS Code, PyCharm ou outro de sua preferência)

## Criando o ambiente virtual

Sempre crie um ambiente virtual para projetos Django. Isso isola as dependências do projeto:

```bash
mkdir lista-tarefas
cd lista-tarefas
python3 -m venv venv
```

Ative o ambiente virtual:

```bash
# Linux e macOS
source venv/bin/activate

# Windows
venv\Scripts\activate
```

Você verá `(venv)` no início da linha do terminal, indicando que o ambiente está ativo.

## Instalando o Django

Com o ambiente virtual ativo, instale o Django:

```bash
pip install django
```

Verifique a instalação:

```python
python -c "import django; print(django.get_version())"
```

## Criando o projeto

O Django separa a estrutura em **projeto** (configurações globais) e **aplicações** (módulos funcionais). Crie o projeto:

```bash
django-admin startproject config .
```

O ponto (`.`) no final cria o projeto na pasta atual, evitando uma pasta aninhada desnecessária. A estrutura gerada é:

```
lista-tarefas/
    config/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    manage.py
    venv/
```

Teste se tudo funciona:

```bash
python manage.py runserver
```

Acesse `http://127.0.0.1:8000/` no navegador. Se você vir a página de boas-vindas do Django, está tudo certo.

## Criando a aplicação

Agora vamos criar a aplicação de tarefas:

```bash
python manage.py startapp tarefas
```

Registre a aplicação no arquivo `config/settings.py`:

```python
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tarefas',  # Nossa aplicação
]
```

## Criando o modelo

Modelos definem a estrutura dos dados. Edite `tarefas/models.py`:

```python
from django.db import models


class Tarefa(models.Model):
    titulo = models.CharField(max_length=200)
    descricao = models.TextField(blank=True)
    concluida = models.BooleanField(default=False)
    criada_em = models.DateTimeField(auto_now_add=True)
    atualizada_em = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-criada_em']

    def __str__(self):
        return self.titulo
```

Crie e aplique a migração para gerar a tabela no banco de dados:

```bash
python manage.py makemigrations
python manage.py migrate
```

## Configurando o painel administrativo

O Django vem com um painel admin pronto. Registre o modelo em `tarefas/admin.py`:

```python
from django.contrib import admin
from .models import Tarefa


@admin.register(Tarefa)
class TarefaAdmin(admin.ModelAdmin):
    list_display = ['titulo', 'concluida', 'criada_em']
    list_filter = ['concluida']
    search_fields = ['titulo', 'descricao']
```

Crie um superusuário para acessar o admin:

```bash
python manage.py createsuperuser
```

Acesse `http://127.0.0.1:8000/admin/` e faça login. Você já pode criar, editar e excluir tarefas pelo painel.

## Criando as views

Views processam requisições e retornam respostas. Edite `tarefas/views.py`:

```python
from django.shortcuts import render, redirect, get_object_or_404
from .models import Tarefa


def lista_tarefas(request):
    tarefas = Tarefa.objects.all()
    return render(request, 'tarefas/lista.html', {'tarefas': tarefas})


def criar_tarefa(request):
    if request.method == 'POST':
        titulo = request.POST.get('titulo')
        descricao = request.POST.get('descricao', '')
        if titulo:
            Tarefa.objects.create(titulo=titulo, descricao=descricao)
        return redirect('lista_tarefas')
    return render(request, 'tarefas/criar.html')


def alternar_tarefa(request, pk):
    tarefa = get_object_or_404(Tarefa, pk=pk)
    tarefa.concluida = not tarefa.concluida
    tarefa.save()
    return redirect('lista_tarefas')


def excluir_tarefa(request, pk):
    tarefa = get_object_or_404(Tarefa, pk=pk)
    tarefa.delete()
    return redirect('lista_tarefas')
```

## Configurando as URLs

Crie o arquivo `tarefas/urls.py`:

```python
from django.urls import path
from . import views

urlpatterns = [
    path('', views.lista_tarefas, name='lista_tarefas'),
    path('criar/', views.criar_tarefa, name='criar_tarefa'),
    path('alternar/<int:pk>/', views.alternar_tarefa, name='alternar_tarefa'),
    path('excluir/<int:pk>/', views.excluir_tarefa, name='excluir_tarefa'),
]
```

Inclua as URLs da aplicação no arquivo principal `config/urls.py`:

```python
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('tarefas.urls')),
]
```

## Criando os templates

Crie a pasta de templates: `tarefas/templates/tarefas/`. Primeiro, o template base. Crie `tarefas/templates/tarefas/base.html`:

```html
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lista de Tarefas</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 0 20px; }
        .tarefa { padding: 10px; border-bottom: 1px solid #ddd; display: flex; align-items: center; justify-content: space-between; }
        .concluida { text-decoration: line-through; color: #888; }
        input[type="text"] { padding: 8px; width: 100%; margin-bottom: 10px; }
        button, .btn { padding: 8px 16px; cursor: pointer; }
    </style>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>
```

Agora, `tarefas/templates/tarefas/lista.html`:

```html
{% extends "tarefas/base.html" %}

{% block content %}
<h1>Minhas Tarefas</h1>
<a href="{% url 'criar_tarefa' %}">Nova Tarefa</a>

{% for tarefa in tarefas %}
<div class="tarefa">
    <span class="{% if tarefa.concluida %}concluida{% endif %}">
        {{ tarefa.titulo }}
    </span>
    <div>
        <a href="{% url 'alternar_tarefa' tarefa.pk %}">
            {% if tarefa.concluida %}Reabrir{% else %}Concluir{% endif %}
        </a>
        <a href="{% url 'excluir_tarefa' tarefa.pk %}">Excluir</a>
    </div>
</div>
{% empty %}
<p>Nenhuma tarefa cadastrada.</p>
{% endfor %}
{% endblock %}
```

E `tarefas/templates/tarefas/criar.html`:

```html
{% extends "tarefas/base.html" %}

{% block content %}
<h1>Nova Tarefa</h1>
<form method="post">
    {% csrf_token %}
    <input type="text" name="titulo" placeholder="Titulo da tarefa" required>
    <textarea name="descricao" placeholder="Descricao (opcional)"></textarea>
    <button type="submit">Criar</button>
</form>
<a href="{% url 'lista_tarefas' %}">Voltar</a>
{% endblock %}
```

## Testando a aplicação

Rode o servidor e teste todas as funcionalidades:

```bash
python manage.py runserver
```

Acesse `http://127.0.0.1:8000/` e experimente criar, concluir e excluir tarefas. Tudo deve funcionar com os dados sendo salvos no banco SQLite padrão do Django.

## Configuração de idioma e fuso horário

Atualize o `config/settings.py` para português do Brasil:

```python
LANGUAGE_CODE = 'pt-br'
TIME_ZONE = 'America/Sao_Paulo'
USE_I18N = True
USE_TZ = True
```

Isso afeta o painel administrativo e mensagens de erro do Django.

## Próximos passos

Com o projeto básico funcionando, você pode evoluir adicionando:

- Autenticação de usuários com `django.contrib.auth`
- Formulários com a classe `ModelForm` do Django
- Testes automatizados com `pytest-django`
- CSS com frameworks como Tailwind ou Bootstrap
- Deploy em um servidor real usando Gunicorn e Nginx

## Conclusão

O Django é um framework robusto que permite criar aplicações web completas rapidamente. Neste guia, você aprendeu a criar um projeto, definir modelos, views, templates e URLs. O painel administrativo gratuito é um diferencial enorme que economiza horas de desenvolvimento. A partir daqui, explore a documentação oficial do Django para aprofundar seus conhecimentos.

Quer comparar a experiência de desenvolvimento web em Python com outras linguagens? Veja como criar projetos web em <a href="https://golang.com.br/blog/" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', {source: 'python.dev.br', target: 'golang.com.br', content: 'primeiro-projeto-django'})">Go</a> e <a href="https://kotlin.dev.br/blog/" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', {source: 'python.dev.br', target: 'kotlin.dev.br', content: 'primeiro-projeto-django'})">Kotlin</a>.
