"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Operações CRUD em Python e Django - Parte 2

Operações CRUD em Python e Django - Parte 2

Publicado em 2024-07-29
Navegar:635

Em nosso artigo anterior, abordamos os fundamentos da configuração de um projeto Django e criamos nosso modelo de exercício , que exibimos no front-end como uma lista. Neste artigo, vamos nos aprofundar na execução de operações CRUD. Para quem não conhece, CRUD significa Criar, Ler, Atualizar e Excluir — essencialmente as quatro ações fundamentais que você pode realizar em seus dados.

Agora que configuramos nossa API na pasta app , simplesmente estenderemos a visualização do índice para lidar com solicitações de criação, atualização e exclusão.

A forma

Vamos configurar um formulário que permita aos usuários criar exercícios. Usaremos modelos HTML para essa finalidade mais uma vez. Para começar, crie um novo modelo chamado add_exercise.html na pasta app/templates.

{% csrf_token %}

Em seguida, em nosso modelo index.html , incluiremos o modelo add_exercise.html usando o seguinte método:

{% extends "base.html" %} {% block content %}
    

Exercises

{% include 'add_exercise.html' %} ... {% endblock %}

Estamos utilizando a tag include aqui, que promove a capacidade de composição em modelos HTML, tornando nosso código mais fácil de manter e entender. Se você atualizar a página em seu navegador, deverá ver o formulário aparecer na tela.

Add Exercise

Em nosso HTML, usamos a tag 

 com o atributo method definido como POST e o atributo action apontando para /, que é o mesmo endpoint que usamos para buscar a lista de exercícios.

Nesse contexto, o csrf_token é um recurso de segurança representado por um valor secreto gerado aleatoriamente. Isso ajuda a proteger nossos envios de formulários contra ataques de falsificação, que é o que CSRF significa: falsificação de solicitação entre sites. Um token exclusivo é gerado para cada sessão de usuário e não pode ser acessado por sites de terceiros, evitando assim a ocorrência de alterações não autorizadas.

Nosso formulário inclui dois campos de entrada: um para o título e outro para a data, seguindo o esquema do nosso modelo de exercício . Quando o formulário for enviado, os valores de título e data serão enviados por meio de uma solicitação POST para o / endpoint, que será então processado por nossa visualização de índice em app/views.py.

O modelo

No Django, podemos aprimorar nosso modelo Exercise —essencialmente uma classe Python — adicionando métodos específicos que correspondem às operações CRUD. No arquivo app/models.py , incluiremos o seguinte:

class Exercise(models.Model):
    ...

    def create(request):
        title = request.POST.get('title')
        date = request.POST.get('date')

        exercise = Exercise.objects.create(title=title, date=date)

        return exercise

Podemos acessar o título e a data a partir da solicitação POST, conforme mostrado no código acima. Então, podemos utilizar o ORM integrado do Django para criar um novo exercício e retornar a instância criada.

Aproveitaremos a mesma visualização de índice que usamos para recuperar exercícios, expandindo-a para verificar se o método de solicitação é POST. Nesse caso, passaremos o objeto request para o método de classe que definimos anteriormente. Assim que o exercício for criado, redirecionaremos o usuário de volta à página inicial ou realizaremos uma atualização da página, garantindo que o exercício recém-adicionado apareça na tela.

from django.http import HttpResponseRedirect

from app import models

...

def index(request):
    if request.method == 'POST':
        models.Exercise.create(request)
        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Tente criar um novo exercício agora e você deverá vê-lo aparecer no final da lista.

Exercício de atualização

Vamos refatorar um pouco nosso código antes de adicionar funcionalidade de atualização aos exercícios. Moveremos os exercícios para seu próprio modelo chamado exercise.html.

Exercises

{% include 'add_exercise.html' %}
    {% for exercise in exercises %}
  • {% include 'exercise.html' %}
  • {% endfor %}

Crie um modelo para exercise.html na pasta app/templates e adicionaremos o seguinte HTML a ele:

{% csrf_token %}

Estamos usando a tag 

 novamente para cada exercício da lista e adicionando uma entrada oculta para exercise.id, que será usada para atualizar o exercício. Volte ao navegador e atualize a página; você deverá ver um formulário para cada exercício na lista, com cada entrada pré-preenchida com os dados do exercício correspondente.

CRUD Operations In Python & Django - Part 2

Observe que não estamos usando PUT como método de formulário; em vez disso, estamos usando POST. Isso ocorre porque os gerenciadores de visualização só podem analisar dados enviados por meio de solicitações GET e POST , sem suporte integrado para PUT e DELETE. Quando criamos o método create class na classe Exercise , você deve ter notado que usamos request.POST.get('title'). Embora isso funcione para solicitações POST , não há métodos PUT ou DELETE disponíveis no objeto de solicitação.

Mas como podemos diferenciar entre uma solicitação POST e uma solicitação PUT? Se você verificar o formulário que criamos anteriormente, notará que atribuímos um atributo nome ao botão enviar. Podemos acessar esse atributo da mesma forma que acessamos o título e a data, usando request.POST.get('update').

Vamos atualizar o formulário de criação de exercício para incluir a mesma alteração.

...

E em nossa visualização de exercícios , faremos as seguintes alterações para diferenciar as solicitações.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

Verificamos o nome do botão e encaminhamos a solicitação para o método de exercício apropriado.

Vamos adicionar um método de classe de atualização ao modelo de exercício em app/models.py.

def update(request):
    id = request.POST.get('id')
    title = request.POST.get('title')
    date = request.POST.get('date')

    exercise = Exercise.objects.filter(pk=id).update(title=title, date=date)

    return exercise

Para atualizar uma linha no banco de dados, podemos usar o método de atualização disponível no modelo de exercício. Porém, antes de atualizar, precisamos garantir que estamos atualizando o exercício correto. Para fazer isso, filtramos os exercícios pela chave primária, que é id, e atualizamos apenas aquele exercício específico.

Excluir exercício

Da mesma forma, adicionaremos um botão de exclusão ao lado de cada exercício no modelo exercicio.html.

...

Definiremos delete como o valor do atributo name e, em views.py, estenderemos as instruções if...elif para lidar com a operação de exclusão.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST
        delete = 'delete' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)
        elif delete == True:
            models.Exercise.delete(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

E no modelo Exercício, adicionaremos o método de classe delete.

def delete(request):
    id = request.POST.get('id')
    is_deleted = Exercise.objects.filter(pk=id).delete()

    if is_deleted == 1:
        return True

    return False

Com esta adição, implementamos com sucesso operações CRUD em nosso aplicativo Python e Django.

Principais conclusões

  1. Os manipuladores de visualização do Django não suportam solicitações PUT e DELETE, pois não analisam os parâmetros de consulta ou o corpo da solicitação para esses métodos HTTP. Como resultado, devemos confiar nas solicitações POST e diferenciá-las passando um campo adicional no corpo da solicitação.
  2. Percebi que estou fazendo a solicitação POST para a mesma rota da qual estou buscando os exercícios. Isso é importante porque se você criasse um endpoint como /api/exercises para lidar com solicitações, precisaria gerenciar o redirecionamento manualmente. Caso contrário, o comportamento da tag
    após a solicitação é redirecionar o usuário para o endpoint especificado no atributo action. Portanto, você precisará redirecionar manualmente o usuário de volta para a página desejada ou, no nosso caso, manter o usuário na mesma página.
from django.http import HttpResponseRedirect

def index(request):
    ...

    return redirect('/')
    # or
    return HttpResponseRedirect(request.META['HTTP_REFERER'])

Em resumo, gerenciando efetivamente nossas solicitações POST e garantindo o redirecionamento adequado, podemos criar uma experiência de usuário perfeita ao implementar operações CRUD em nosso aplicativo Django.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/prvnbist/crud-operations-in-python-django-part-2-4fad?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3