View
148
Download
8
Category
Preview:
Citation preview
DESENVOLVIMENTO WEB COM
Vinicius Coelhovncs.coelho@gmail.com
Guilherme Garciaguilesgarcia@gmail.com
Introdução ao Python
1. Sintaxe2. Variáveis3. Loops4. Funções5. Orientação a objetos
2 Tópicos abordadosDjango e Projeto de Microblog
1. Criação de projetos2. Criação de aplicações3. Criação de classes4. Relacionamento entre classes5. Criação de urls6. Criação de views7. Criação de templates
3
POR QUÊ USAR O DJANGO?
● Desenvolvimento ágil● Orientado a objetos● Fácil gerenciamento de Banco de dados● Possui painel administrativo com diversas funções● Possui uma comunidade colaborativa muito ativa
O que é Django? Por quê usar?SITES QUE USAM DJANGO
Conjunto de ferramentas em Python para agilizar o desenvolvimento web.
4 Simplicidade do Python
public class OlaMundo { public static void main(String[] args) { System.out.println("Olá mundo"); }}
print ('Olá Mundo!')
Java Python
5 Sintaxe
if <condição>:
<bloco de código>
<bloco de código>
elif <condição>:
<bloco de código>
else:
<bloco de código>
if (condição) {
<bloco de código>;
}
else if (condição) {
<bloco de código>;
}
else {
<bloco de código>;
}
6 Variáveis
numero = 123
decimal = 10.5
palavra = “Olá Mundo!”
booleano = True
● É uma posição na memória que armazena um valor
● Não é preciso declarar o tipo
● É o conteúdo da variável determina o seu tipo
7 Condições
if numero == 0:
print(‘O número é zero’)
elif numero % 2 == 0:
print('Par')
else:
print('Impar')
if Se o número for igual a zero, informar que o número é igual a zero.
elif Senão se o número tiver resto igual a zero, o número é par.
else Caso contrário, o número é ímpar.
8 OperadoresAritiméticos Comparação Lógicos
Igual==
Diferente!=
Maior que>
Menor que<
Maior ou igual>=
Menor ou igual<=
Soma+
Subtração-
Multiplicação*
Divisão/
Eand
Ouor
Emin
Éis
Nãonot
if x <= 3 and x > 0:
x += 1
9 Funções
def soma(x, y):
return x + y
def parametro_opcional(nome=None):
print(nome)
resultado = soma(2,5)
● Função é um bloco de código que realiza uma tarefa específica.
● Evita repetição: ○ Podemos criar uma única
função e chamar ela diversas vezes no código.
● É definida por “def”;
● Uma função pode:○ Receber parametros○ Retornar valores
São conjuntos ordenados de valores, onde cada valor é identificado por um índice.
O índice é o número relativo à posição do dado que queremos acessar:
10 Listas
# Declaraçãolista_vazia = list()
numeros = [2, 1, 3, 5, 4];
palavras = ["abc", "b", "cachorro"]
lista_mista = ['gato', 'bola', 1997, 2000];
# Acessoprint (palavras[2]) # cachorro
2 1 3 5 4[1] [2] [3] [4] [5]
● Listas utilizam inteiros como índices.
● Dicionários utilizam qualquer tipo de dados como índice.
○ dicionario[“indice”]
● Um dicionário vazio é declarado com o uso de dict( ) ou { }.
11 Dicionários
# Declaração
dict_vazio = dict()
pessoa = {'nome': 'Maria', 'idade': 7}
# Acesso
print (pessoa['nome'])
CHAVE VALOR
12 Estruturas de repetição
x = 0
while x < 10:
print (x)
x += 1 # Aumenta de 1 em 1
nomes = ['João', 'Maria', 'Bruno']
for nome in nomes:
print(nome)
# Imprime de 0,...9
for x in range(10):
print(x)
For While
Estratégia que visa facilitar a utilização de conceitos da vida real na programação, utilizando classes para descrever estes conceitos e objetos para representá-los.
Não existe uma variável do tipo “pessoa”. Como representamos pessoas no código?
13 Orientação a Objetos com Python
Python
14 Orientação a objetos com Python
maria = Pessoa()
maria.nome = 'Maria'
maria.idade = 20
maria.falar_nome()
class Pessoa(object):
nome = "" # características
idade = 0 # características
def falar_nome(self): # comportamento
print (self.nome)
Classe Objeto
As classes são as instruções de como deve ser um objeto.
● atributos da classe definem suas características
● métodos definem o comportamento da classe.
15 Classes
class Jedi(object):sabreDeLuz = "Verde"
def sacarSabreDeLuz(self):print ("Pssshhew")
ATRIBUTO
MÉTODO
Um objeto é uma entidade criada de acordo com a classe, possuindo as informações que desejarmos, podendo ser replicado sempre que necessário.
16 Objetos
obiWan = Jedi()obiWan.corDoSabre = “Azul”
yoda = Jedi()yoda.corDoSabre = “Verde”
obiWan.sacarSabreDeLuz()yoda.sacarSabreDeLuz()
17 Herança
class Cao(object):def latir(self):
print ("Au!")
class Poodle(Cao):corDoPelo = ""
class Viralata(Cao):pedigree = False
CÃOClasse genérica que serve como base
Uma classe possui como atributo um objeto de outra classe
18 Agregação
class Aluno(object):turma = None
class Turma(object):nome = '201B'
turma = Turma()aluno = Aluno()aluno.turma = turma
Escreva um programa.py que contem uma classe Pessoa com as seguintes informações: nome, ano de nascimento, endereço. Além disso, deve conter um método para obter idade (idade = ano_nascimento - ano_atual).
Em seguida, crie uma classe funcionário que herda a classe pessoa e acrescenta as seguintes informações: salario e cargo. Por fim, construa um funcionário abaixo:
19 Exercício de Python
Nome Ano nascimento
Endereço Salario
João Silva 1985 Santa Maria R$ 3.000
20 Resultado exercício
funcionario = Funcionario()funcionario.nome = 'João Silva'funcionario.ano_nascimento = 1985funcionario.endereco = 'Santa Maria'funcionario.salario = 3000
print(funcionario.obter_idade())
#coding:utf-8class Pessoa(object):
nome = “” endereco = “” ano_nascimento = 0
def obter_idade(self): return 2016 - self.ano_nascimento
class Funcionario(Pessoa): cargo = '''' salario = 0
Classe Objeto
NO WINDOWS
1. Vá até o site oficial do Python: www.python.org2. Baixe o installer da versão 2.7 de acordo com seu SO
(64 ou 32 bits)3. Abra o Prompt de Comando e digite:
21
NO LINUX
1. Abra o console e digite:
pip install django
sudo apt-get install python-pip
sudo pip install django
Instalando o Django
Microblog onde os usuários podem publicar pequenos textos, seguir pessoas e curtir textos de outras pessoas.
22 Projeto MicroblogDiagrama de Classes Casos de Uso
Projeto: https://github.com/guilegarcia/Microblog
Um projeto Django é feito por diversas aplicações (apps).
Devido a natureza modular do Django, um app pode ser transferido de um projeto a outro.
23 Estrutura do Projeto
Microblog
Autor
Posts
PROJETO
APPs
Páginas: (possuem entrada no urls.py, views.py e um template HTML )● Timeline● Quem seguir● Criar autor● Criar post● Login
Links: (possuem entrada somente no urls.py e views.py)● Sair● Excluir conta● Seguir usuário● Unfollow● Curtir post
24 Conteúdo do Projeto
Vamos criar o nosso projeto chamado Microblog, digitando no console:
25 Criando o projeto
django-admin startproject Microblog
26 Estrutura do projeto
__init__.py
settings.py (configurações do projeto)
urls.py (geralmente importa as urls das aplicações)
wsgi.py
Microblog
Microblog
Vamos criar a aplicação “posts” do nosso projeto Microblog.
27 Criando a aplicação “posts”
python manage.py startapp posts
28 Estrutura da aplicação
__init__.py
admin.py
models.py
tests.py
migrations
posts
urls.py (precisa criar)
views.py
Crie as aplicações utilizando o terminal e as adicione em INSTALLED_APPS no /Microblog/settings.py
29 Criando as aplicações
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'posts',)
30 Arquitetura do Django
( (r’^contato/$’, ‘blog.contato’), (r’^posts/$’, ‘blog.posts’),)
urls.py
{% extends ‘base.html’%}
{% block content %}
{% for p in posts %} <h1>{{p.title}}</h1> <p>{{p.content}}</p> {% endfor %}
{% endblock %}
posts.html
def posts(request): p=Post.objects.all() return render(request, ‘posts.html’. {‘posts’:p})
views.pyclass Post(Model): title=CharField(max_lenght=50) content=TextField() date=Datefield() cat=ForeignKey(Category) autor=CharField(max_lenght=50)
class Category(Model): name=CharField()
models.py
Cliente
Request
Response
● São classes que define os dados que serão trabalhados na aplicação.
● Cada classe é uma tabela no banco de dados
● Classes importam de models.Model
● Possui diferentes tipos de atributos
Nosso projeto tem duas Classes: Autor e Post
31 Modelos /app/models.py
from django.db import models
class Pessoa(models.Model):nome =
models.CharField(max_length=30)endereco = models.TextField()email = models.EmailField()
boolean = models.BooleanField()
string = models.CharField()
data = models.DateTimeField()
email = models.EmailField()
arquivo = models.FileField()
numero_real = models.FloatField()
numero_inteiro = models.IntegerField()
32 Atributos das classes no Django
imagem = models.ImageField()
endereco_de_ip = models.IPAddressField()
Inteiro_positivo = models.PositiveIntegerField()
texto = models.TextField()
url = models.URLField()
outra_classe = models.ForeignKey()
muitos_para_muitos = models.ManyToManyField()
Atributos importados do modulo: from django.db import models
https://docs.djangoproject.com/en/1.10/ref/models/fields/
1. Herança 2. Many-to-one (Muitos para um)3. Many-to-many (Muitos para Muitos)4. One-to-one (Um para um)
33 Relacionamentos entre classes Django
34 Relacionamentos entre classes - Herança
from django.db import models
class Pessoa(models.Model): nome = models.CharField(max_length=2)
class Funcionario(Pessoa): pass
class Professor(Pessoa): pass
35 Relacionamento - Many-to-one(ForeignKey)
class Banda(models.Model): pass
class Musico(models.Model):banda = models.ForeignKey(Banda)
36 Relacionamentos entre classes - Many-to-many
class Autor(models.Model):nome = models.CharField(max_length=30)data_nascimento = models.DateField()
class Artigo(models.Model): titulo = models.CharField(max_length=100) autores = models.ManyToManyField(Autor)
37 Relacionamentos entre classes - One-to-one (é um)
class Local(models.Model): nome = models.CharField(max_length=50) endereco = models.CharField(max_length=80)
class Restaurante(models.Model): local = models.OneToOneField(Local,primary_key=True,) serve_pizza = models.BooleanField(default=False)
38 Criando a classe “Post”
from django.db import models
from autores.models import Autor
class Post(models.Model):
texto = models.TextField(max_length=140) #max_lenght define o máximo de caracteres do
campo
likes = models.IntegerField(default=0)
autor = models.ForeignKey(Autor, null=True, blank=True)
data_hora = models.DateTimeField(auto_now_add=True) #auto_now_add adiciona a hora atual
/posts/models.py
● Utilizaremos o usuário padrão para criar Autor
● Django fornece um usuário padrão que pode ser utilizado na aplicação.
● A classe User será utilizada na autenticação dos usuários
● É possível estender o User e acrescentar informações (AbstractUser)
39 Usuário padrão do Django
Referência: https://docs.djangoproject.com/pt-br/1.10/ref/contrib/auth/#user-model
Crie a aplicação “autores” e a classe “Autor” contendo o campo:
● biografia (models.TextField)● Lembre-se de add a nova aplicação em settings.py/INSTALLED_APPS
40 Exercício - Aplicação e classe para autores
41 Criando a classe “Autor”
from django.db import models
from django.contrib.auth.models import AbstractUser
class Autor(AbstractUser): # Herda do usuário comum do Django
seguindo = models.ManyToManyField('self', null=True, blank=True)
biografia = models.TextField(blank=True, null=True)
/autores/models.py
42 Adicionar Autor no Settings.py
# Usuário padrãoAUTH_USER_MODEL = 'autores.Autor'
Adicionar o Autor como usuário padrão do Django em:
/Microblog/Microblog/settings.py
43 Atualizando o Banco de Dados
# Verifica quais atualizações são necessárias
python manage.py makemigrations
# Aplica as atualizações no banco de dados
python manage.py migrate
Após modificações no models.py deve se utilizar os comandos abaixo no terminal, fazendo com que o Django atualize o Banco de Dados.
44 Arquitetura do Django
HTMLPY
PY
views.py
template.htmlmodels.py
PY
urls.py
NAVEGADOR
Criar uma url e uma views.py na aplicação “posts”
45 Criar a primeira views.py
from django.http import HttpResponse
def index(request): return HttpResponse("Olá mundo")
from django.conf.urls import url
from . import views
urlpatterns = [ url(r'^$', views.index, name='index'),]
Uma URL pode apontar para uma função ou classe. A urls.py da parte principal do projeto geralmente inclui as urls das aplicações.
46 Mapeamento de URLs
from django.conf.urls import urlfrom models.views import criar_autor
urlpatterns = [url(r'^criar-autor/$', criar_autor, name='criar_autor'),
]
• Nome da requisição no navegador. Ex: www.site.com/criar-autor/
• O r na frente da url significa que a expressão deve ser tratada como somente texto.
• A requisição deve executar a função determinada aqui.
• Nome utilizado para este caminho de URL quando chamado através de variável.
Ex: {% url ‘criar_autor’ %}
● Para exibir as informações na web é preciso do HTML.
● O HTML é estático, não é possível criar variáveis, listar objetos, etc.
● Para isso o Django disponibiliza a linguagem de templates.
47 HTML<!DOCTYPE HTML> <html lang="pt-br"><head> <title>TÍTULO</title></head><body> <header> <nav> <ul> <li>Menu</li> </ul> </nav> </header>
<footer> <p>RODAPÉ</p> </footer></body></html>
O templates do Django adicionar algumas funcionalidades ao HTML estático da aplicação.
Exemplo:
● Exibir variáveis;● Imprimir listas (for)● Criar condições (if, else)
48 Templates Django
Uma variável emite um valor a partir do contexto, que é um objeto dicionário que mapeia chaves para valores. {“chave”:”valor”}
{{ variáveis }}
49 Templates Django - Variáveis
<!DOCTYPE html>
<html>
<body>
<p>Meu nome é {{ nome }} e minha idade
{{ idade }}.</p>
</body>
</html>
As tags fornecem lógica no processo de renderização das páginas HTML.
Tags são definidas por {% tag %}
50 Templates Django - Tags
<!DOCTYPE html><html><body>
{% if numero > 0 %}<p>Positivo</p>
{% else %}<p>Negativo</p>
{% endif %}
</body></html>
51 Templates Django - Lista de Tags
https://docs.djangoproject.com/pt-br/1.10/ref/templates/builtins/#ref-templates-builtins-tags
<!DOCTYPE html><html><body>
{% for autor in lista_autores %} <p>{{ autor.nome }}</p>
{% empty %} <p>Não há autores.</p>
{% endfor %}
</body></html>
{% for %} imprime os itens de uma lista
{% url 'nome_da_url' %} imprime a url
{% now 'd/m/Y H:i' %} imprime a data e hora atual
Servem para transformar os valores de variáveis e tags dentro do html.
Usa-se uma barra: | filtro
{{ variavel | filtro }}
52 Templates Django - Filtros
53 Templates Django - Lista de Filtros
<!DOCTYPE html><html><body>
{{ minha_data|date:"d-m-Y" }} {# 15/11/2016 #}{{ variavel|default_if_none:"Em Branco" }}{{ variavel|title }} {# Título Com Maiúscula #}{{ variavel_lista|first }} {# Primeiro item da lista #}
</body></html>
https://docs.djangoproject.com/pt-br/1.10/ref/templates/builtins/#ref-templates-builtins-filters
54 Herdando templates
<!DOCTYPE html><html>{% block “titulo” %}
{% endblock %}
<body>{% block “conteudo” %}--Aqui vai o HTML customizado{% endblock %}
</body></html>
{% extends “base.html” %}
{% block “titulo” %}<h1>Título da página</h1>
{% endblock %}
{% block “conteudo” %}<p>Corpo da página<p/>
{% endblock %}
filho.htmlbase.html
Salve as pastas /css/, /js/ e /fonts/ na pasta:
/Microblog/static/
55 Importar arquivos CSS e JS para o projeto
# Static files (CSS, JavaScript, Images)STATIC_URL = '/static/'STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static/'),)
https://github.com/guilegarcia/Microblog/tree/master/static
Salve a pasta /templates/ na pasta:
/Microblog/
Adicione dentro de [] em ‘DIRS’:
os.path.join(BASE_DIR, 'templates')
56 Importar arquivos .html do projeto
TEMPLATES = [ 'DIRS': [os.path.join(BASE_DIR, 'templates')]]
https://github.com/guilegarcia/Microblog/tree/master/templates
Servem para o envio de informações do cliente para o servidor. Usados em cadastros, logins, pesquisas, etc.
57 Formulários
Login
Senha
ENTRAR
*******************
usuario
● Django da pronto os métodos login() e logout()
○ Precisamos criar as urls e o HTML.● @login_required● request.user
58 Autenticação do usuário
59 Autenticação do usuário - urls
from django.contrib.auth import views
urlpatterns = [
# Login autentificacaourl(r'^$', views.login, {'template_name': 'login.html'}, name='login'),url(r'^logout/$', views.logout, {'next_page': '/'}, name='logout'),
]
60 Forms do Django - HTML e tags
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="{% url 'login' %}" method="post"> {% csrf_token %}
<label for="your_name">Usuário: </label>
<input id="your_name" type="text" name="username" >
<label for="your_name">Senha: </label>
<input id="your_name" type="password" name="password" >
<input type="submit" value="Logar">
</form>
</body>
</html>
61 Settings.py
# Autentificacao do usuarioLOGIN_URL = "/login/"LOGOUT_URL = "/sair/"LOGIN_REDIRECT_URL = "/index/"
É preciso adicionar o usuário padrão (que será utilizado para autenticação) e as urls para login em /projeto/settings.py
Para obter o usuário logado no sistema usa-se o request.user
Ao chamar a função login(request, user), definida no método logar(), o usuário é inserido na sessão. Para obter o usuário que está na sessão usa-se o request.user
62 Obter usuário logado
from django.contrib.auth.decorators import login_requiredfrom django.shortcuts import render
@login_requireddef autor(request):
autor = request.userreturn render(request, 'autor.html', {'autor':
autor})
Usa-se o @login_required para garantir que apenas os usuários logados acessem um determinado controller (views.py).
Caso o usuário não esteja logado, o Django irá redirecionar para a página de login especificada em settings.py.
63 @login_required
from django.contrib.auth.decorators import login_requiredfrom django.shortcuts import render
@login_requireddef autores(request):
autores = Autor.objects.all()return render(request, 'autores.html',
{'autores': autores})
1. Crie um arquivo urls.py na pasta das aplicações posts e autores
2. Importe as urls das aplicações posts e autores na urls.py
64 Importando as URLs das aplicações
urlpatterns = [
url(r'^autores/', include('autores.urls')), # /autores/**url(r'^posts/', include('posts.urls')), # /posts/**
]
65 Consultas no banco de dados
# Busca todos autores
autores = Autor.objects.all()
# Busca um autor
autor = Autor.objects.get(id=1)
# Autores que se chamam “João”
autores_nome = Autor.objects.filter(first_name='João')
# Todos os posts ordenados por data e hora de criação
posts_ordenados = Post.objects.all().order_by('data_hora')
Crie uma função para listar os autores. Passos:
1. Criar função “autores” em /autores/views.py a. Buscar todos autores no banco de dadosb. Enviar esse autor para o template “autores.html” usando render()
2. Criar a /autores/urls.py r'^$' para a função 3. Listar os autores no /templates/autores.html usando {% for
%}
66 Exercício: Listar autores
67 Listar autores
from django.conf.urls import urlfrom autores import views
urlpatterns = [ url(r'^$', views.autores, name='autores'),]
from autores.models import Autorfrom django.shortcuts import render
def autores(request): autores = Autor.objects.all() return render(request, 'autores.html',
{'autores': autores})
68 Timeline (listar posts)
from django.conf.urls import urlfrom posts.views import index
urlpatterns = [ url(r'^index/$', index, name='index'),
]
from django.shortcuts import redirectfrom .models import Postfrom django.db.models import Qfrom django.contrib.auth.decorators import login_required
@login_requireddef index(request):
autor = request.userif autor.seguindo: # None não funciona no filter
# Q = OR (sql) __in (verifica uma lista) posts = Post.objects.filter(Q(autor__in=autor.seguindo.all()) | Q(autor=autor)) # .all() busca todos itens que estão seguindoelse: posts = Nonereturn render(request, 'index.html', {'posts': posts})
69 Acessar autor
from django.conf.urls import urlfrom autores import views
urlpatterns = [ url(r'^(?P<id>\d+)/$', views.autor, name='autor'),]
from django.shortcuts import render, get_object_or_404from autores.models import Autor
def autor(request, id=None):autor = get_object_or_404(Autor, id=id)posts = Post.objects.filter(autor=autor)return render(request, 'autor.html', {'autor': autor, 'posts': posts})
70 Excluir autor
from django.conf.urls import urlfrom autores import views
urlpatterns = [ url(r'^excluir/(?P<id>\d+)/$', views.excluir_autor, name='excluir_autor'),]
from django.shortcuts import render, get_object_or_404from autores.models import Autor
def excluir_autor(request, id=None): """ Recebe o id do Autor e exclui """ autor = get_object_or_404(Autor, id=id) autor.delete() return redirect('index')
71 Seguir autor
from django.conf.urls import urlfrom autores import views
urlpatterns = [ url(r'^seguir/(?P<id>\d+)/$', views.seguir, name='seguir_autor'),]
from django.shortcuts import redirectfrom autores.models import Autor
def seguir(request, id=None): """ Recebe o id do usuário que irá seguir """ autor_seguir = Autor.objects.get(id=id) autor = request.user autor.seguindo.add(autor_seguir) # .add adiciona na lista de seguindo autor.save() return redirect('autores')
72 Unfollow autor
from django.conf.urls import urlfrom autores import views
urlpatterns = [ url(r'^unfollow/(?P<id>\d+)/$', views.unfollow, name='unfollow'),]
from django.shortcuts import redirectfrom autores.models import Autor
def unfollow(request, id=None): """ Recebe o id do usuário que irá seguir """ autor_unfollow = Autor.objects.get(id=id) autor = request.user autor.seguindo.remove(autor_unfollow) # .remove remove da lista de seguindo autor.save() return redirect('autores')
73 Curtir post
from django.conf.urls import urlfrom autores import views
urlpatterns = [ url(r'^curtir/(?P<id>\d+)/$', views.curtir, name='curtir_post'),]
from django.shortcuts import render, get_object_or_404from .models import Post
@login_requireddef curtir(request, id=None):
post = get_object_or_404(Post, id=id)post.likes += 1post.save()
# request.META.get('HTTP_REFERER') mostra de onde veio a requisição (index ou autor)return redirect(request.META.get('HTTP_REFERER'))
É uma alternativa para implementar Views como classes ao em vez de funções. O Django disponibiliza diversas classes prontas que podem ser adaptadas. Exemplos:
● CreateView● UpdateView
74 Forms do Django - Class-based views
75 Resultado - CreateView Autor
from django.conf.urls import urlfrom autores.views import AutorCreate
urlpatterns = [ url(r'^criar-autor/$', CriarAutor.as_view(), name='criar_autor'),]
76 Resultado - CreateView Autor
from django.views.generic.edit import CreateViewfrom autores.models import Autor
class CriarAutor(CreateView):model = Autor
fields = ['first_name', 'last_name', 'email', 'username', 'password'] template_name = 'criar-autor.html' success_url = '.'
def form_valid(self, form): usuario = form.save(commit=False) usuario.set_password(form.cleaned_data['password']) usuario.save() return super(CriarAutor, self).form_valid(form)
Crie:
1. URL para o CriarPost (CreateView) em /posts/urls.py2. Crie a classe CriarPost(CreateView) para criar os posts em /posts/views.py.
a. Em fields adicione apenas ‘texto’ e ‘autor’
Obs: É preciso criar o arquivo urls.py
77 Exercício - Criar Post
78 Resultado - CreateView Post
from django.views.generic.edit import CreateView
class CriarPost(CreateView): model = Post fields = ['texto', 'autor'] template_name = 'criar-post.html' success_url = '.'
79 Resultado - CreateView Post
from django.conf.urls import urlfrom .views import CriarPost
urlpatterns = [ url(r'^criar/$', CriarPost.as_view(), name='criar_autor'),]
Recommended