1
resposta

Trabalhando com FORMs no DJANGO

Na formação Django não achei nenhuma parte mostrando como trabalhar com (forms.ModelForm). Estou tentando pela documentação do Django e consegui inserir registros aparentemente corretamente, mais não consigo editar registros existentes (ele sempre cria um novo registro). Eu preciso de duas views (uma para editar e outra para salvar) ou posso fazer as duas operações na mesma View? Se alguém puder ajudar agradeço:

# models.py
class Setor(models.Model):
    nome = models.CharField(max_length=50, unique=True, blank=False)
#urls.py
urlpatterns = [
    path('setores',views.setores,name='setores'),
    path('setor',views.setor,name='setor'),
    path('setor/<int:id>',views.setor_id,name='setor_id')
]
#views.py
def setores(request):
    setores = Setor.objects.all()
    records = {
        'setores' : setores
    }
    return render(request,'rhm/setores.html', records)

def setor(request):
    if request.method == 'POST':
        form = SetorForm(request.POST)
        if form.is_valid():
            form_clean = form.cleaned_data
            form.save()
            return redirect('setores')
    else:
        form = SetorForm()
    return render(request,'rhm/setor.html',{'form':form})

def setor_id(request, id):
    setor = Setor.objects.get(pk=id)
    form = SetorForm(instance=setor)
    if request.method == 'POST':
        form = SetorForm(request.POST, instance=setor)
        if form.is_valid():
            setor = form.cleaned_data
            setor.save()
            return redirect('setores')
        else:
            return render(request,'rhm/setor.html',{'form':form,'setor':setor})
    elif(request.method == 'GET'):
        return render(request,'rhm/setor.html',{'form':form,'setor':setor})
1 resposta

Oi Rafael, bom dia. Como você está? Espero que esteja bem ^-^

Temos um curso de django que foca em Forms(forms.ModelForm) que inclusive está na formação de Django:

Quanto ao problema que você vem enfrentando:

Eu preciso de duas views (uma para editar e outra para salvar) ou posso fazer as duas operações na mesma View?

Pode fazer a operação na mesma view(arquivo) e utilizar apenas uma rota para edição.

Mas não consigo editar registros existentes (ele sempre cria um novo registro)

Aparentemente o seu código está correto. Porém, podemos simplificá-lo da seguinte forma:

def setor_id(request, id):
    setor = Setor.objects.get(pk=id)
    if request.method == 'POST':
        form = SetorForm(request.POST, instance=setor)
        if form.is_valid():
            setor = form.cleaned_data
            setor.save()
            return redirect('setores')
    else:
        form = SetorForm(instance=setor, auto_id=setor.id)

    return render(request,'rhm/setor.html',{'form':form,'setor':setor})

Seria interessante analisar como estão os seus templates html também, se está redirecionando para rota correta e passando os devidos valores. Qualquer dúvida estou por aqui, ta bom?

Podemos fazer passo a passo seguindo o exemplo do curso caso prefira :D

Abraços e bons estudos!