Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Editando Perfis

Cheguei na ultima aula do curso de Django, mas não nos foi ensinado como editar os perfis, nem todas as etapas da implementação no django do CRUD, pesquisando na internet e ainda sim estou perdido, pois na aplicação que preciso é necessário editar um objeto.

Vejam:

Esse é o Model:

class Atendimento(models.Model):

    operador = models.CharField(max_length=25, null=False)
    solicitante = models.CharField(max_length=50, null=False)
    telefone_solicitante = models.CharField(max_length=16, null=False)
    placa = models.CharField(max_length=12, null=False)
    frota = models.CharField(max_length=10, null=False)
    motivo = models.CharField(max_length=30, null=False)
    protocolo = models.CharField(null=False, max_length=30, default=datetime.today().strftime('%d%m%Y%H%M%S'))
    data = models.CharField(default=datetime.today().strftime('%d/%m/%Y %H:%M'), max_length=30)

Esse é o forms.py

class AtendimentoForm(forms.ModelForm):
    class Meta:
        model = Atendimento
        fields = ('solicitante', 'telefone_solicitante', 'placa', 'frota', 'motivo', 'protocolo',)

Esse é o novoatendimento.html

{% extends "baseatd.html" %}
{% load bootstrap3 %}

{% block body %}
    <form class="form-sigin" action="{% url 'novoatendimento' %}" method="POST">
        <h2 class="form-sigin-heading">Novo Atendimento</h2>
        {% csrf_token %}
        {% bootstrap_form form layout='inline' size='large' %}
        <hr/>

            <button type="submit" class="btn btn-lg btn-primary"> Salvar </button>

    </form>
{% endblock %}

e a view do novo atendimento

def NovoAtendimento(request):
    if request.method == "POST":
        form = AtendimentoForm(request.POST)
        if form.is_valid():
            novoatendimento = form.save(commit=False)
            novoatendimento.operador = 'Paulo'
            novoatendimento.save()
            return redirect('index')
    else:
        form = AtendimentoForm()
    return render(request, 'novoatendimento.html', {'form': form})

Essa é a parte de Create, e funciona perfeitamente. A parte Read que é ver os dados também, veja como eu fiz: Tem duas, Uma onde são mostrados todos os atendimentos:

def indexatendimentos(request):
    return render(request, 'atendimentos.html', {"atds" : Atendimento.objects.all()} )

atendimentos.html

{% extends "baseatd.html" %}
{% load bootstrap3 %}
{% load staticfiles %}
<link href="{% static "styles/atendimentos.css" %}" rel="stylesheet">
{% block body %}

{% if atds %}
<div class="panel panel-default">

  <div class="panel-heading"><strong>TODOS ATENDIMENTOS REALIZADOS</strong>


  </div>
  <table border="3" class="table table-hover table-bordered">
    <thead id="thead-tabela">
        <tr>
              <th>Operador</th>
              <th>Solicitante</th>
              <th>Frota</th>
              <th>Placa</th>
              <th>Protocolo</th>
        </tr>
      </thead>
      <tbody>
      {% for atendimento in atds %}
      <tr>
          <td>{{atendimento.operador}}</td>
          <td>{{atendimento.solicitante}}</td>
          <td>{{atendimento.frota}}</td>
          <td>{{atendimento.placa}}</td>
          <td><a href="{% url 'protocolos' atendimento.protocolo %}">{{atendimento.protocolo}}</a></td>
      </tr>
      </tbody>
      {% endfor %}
    {% else %}
    <p> Ainda não foi realizado nenhum atendimento. </p>
{% endif %}

  </table>
</div>
{% endblock %}

e a outra, mais detalhada

A view

def ticket(request, atendimento_protocolo):
    e_atendimento = Editar_Atendimento(request, protocoloatd=atendimento_protocolo)
    atendimento = Atendimento.objects.get(protocolo=atendimento_protocolo)
    return render(request, 'protocolos.html', {"atd" : atendimento, 'e_atendimento' : e_atendimento}, )

o html

{% extends "baseatd.html" %}

{% block body %}

            <h4>Protocolo:{{atd.protocolo}}</h1>
            <h3></h3>
                Operador: {{atd.operador}} <br>
                Solicitante: {{atd.solicitante}} <br>
                Telefone solicitante: {{atd.telefone_solicitante}}<br>
                Placa: {{atd.placa}}<br>
                Frota: {{atd.frota}}<br>
                Motivo: {{atd.motivo}}<br>
                Protocolo: {{atd.protocolo}}<br>
                Data: {{atd.data}}<br>

<div>
    <a class="btn btn-default" href="{% url 'editaratendimento' protocoloatd=atd.protocolo %}"><span class="glyphicon glyphicon-pencil"></span></a>
</div>

{% endblock %}

Aqui começa a dificuldade, função de editar o atendimento

def Editar_Atendimento(request, protocoloatd):
    atendimento = get_object_or_404(Atendimento, protocolo=protocoloatd)
    if request.method == "POST":
        form = AtendimentoForm(request.POST, instance=atendimento)
        if form.is_valid():
            atendimento.save()
            return redirect('iatendimentos')
    else:
        form = AtendimentoForm(instance=atendimento)
    return render(request, 'novoatendimento.html', {'form': form})

veja, eu instancio o objeto, jogo ele no formulário que eu criei, e vou em Salvar. Porém, ao invés de editar o objeto é criado um novo objeto.

Eu não sei onde estou errando, estou instanciando o objeto editando ele e salvando. Alguém pode me dar uma luz?

Acredito que o erro esteja aqui:

def Editar_Atendimento(request, protocoloatd):
    atendimento = get_object_or_404(Atendimento, protocolo=protocoloatd)
    if request.method == "POST":
        form = AtendimentoForm(request.POST, instance=atendimento)
        if form.is_valid():
            atendimento.save()
            return redirect('iatendimentos')
    else:
        form = AtendimentoForm(instance=atendimento)
    return render(request, 'novoatendimento.html', {'form': form})
def ticket(request, atendimento_protocolo):
    e_atendimento = Editar_Atendimento(request, protocoloatd=atendimento_protocolo)
    atendimento = Atendimento.objects.get(protocolo=atendimento_protocolo)
    return render(request, 'protocolos.html', {"atd" : atendimento, 'e_atendimento' : e_atendimento}, )
1 resposta
solução!

Para alterar é necessário ter Id. Quando você selecionar um para edição, leve o id para o formulário como um input hidden.