1
resposta

Envio de uma lista de Checkbox's para Banco

Olá a todos,

Faço uma seleção de checkbox's com o javascript e coloco os id's dentro de um input listadequestoes envio para o banco. Quando envio as informações são salvas no banco de dados como eu quero, só que aparece um erro que não consigo consertar para que ele vá para pagina return redirect(lista). Alguém pode me ajudar.

models.py

class Prova(models.Model):
    """docstring for Prova"""
    curso     = models.ForeignKey(Curso)
    turma     = models.ForeignKey(Turma)    
    listadequestoes =  models.CharField(max_length = 200, null=True)

form.py

class ProvaForm(ModelForm):
    """docstring for CursoForm"""
    class Meta:
        model = Prova
        fields = ['curso', 'turma', '']

views.py

from sisp.models import Pergunta, Professor, Disciplina, Teste, Prova
from sisp.forms import ProvaForm 

def selecionar_questoes(request):
    lista = Pergunta.objects.all().order_by('-id')
    lcurso = Curso.objects.all().order_by('nome')
    lturma = Turma.objects.all().order_by('nome')
    provaform = ProvaForm(request.POST)
    if request.method == 'POST':
        if provaform.is_valid():
            dados_form = provaform.data
            prova = Prova(listadequestoes = dados_form['listadequestoes'])
            provaform.save()
            prova.save()
            return redirect(lista)
    return render(request, 'selecionarquestoes.html', {'lista_perguntas': lista,
        'lista_curso': lcurso, 'lista_turma': lturma, 'provaform': provaform })

selecionarquestoes.html

{% extends "base.html" %}
{% load bootstrap %}
{% block body %}

<h2>Selecione as Questões para Prova</h2>

<form method="POST">
    {% csrf_token %} 
    <label>Escolha o Curso:</label><br>
        {{provaform.curso}}    
    <br>
    <label>Escolha o Turma:</label><br>
        {{provaform.turma}}  
    <br>
    {% for lista in lista_perguntas %}
        <input type="checkbox" name="questao" value="{{lista.id}}"> Pergunta - {{lista.id}}<br>
    {% endfor %}
    <br>
        <input type="button" onclick="myFunction()" value="Ordernar">
    <br><br>
        <input type="text" id="order" name="listadequestoes" placeholder="Ordem das Questões" required autofocus>
    <br>
    <br>
    <input type="submit" value="Cadastrar">
</form>    

<script>
function myFunction() {
    var questao = document.forms[0];
    var txt = "";
    var i;
    for (i = 0; i < questao.length; i++) {
        if (questao[i].checked) {
            txt = txt + questao[i].value + " ";
        }
    }
    document.getElementById("order").value = txt ;
}
</script>

{% endblock %}

erro que é apresentado

IntegrityError at /selecionar-questoes/
NOT NULL constraint failed: sisp_prova.curso_id
Request Method:    POST
Request URL:    http://localhost:8000/selecionar-questoes/
Django Version:    1.11
Exception Type:    IntegrityError
Exception Value:    
NOT NULL constraint failed: sisp_prova.curso_id
Exception Location:    /home/fgs/.local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 328
Python Executable:    /usr/bin/python
Python Version:    2.7.12
Python Path:    
['/home/fgs/Documentos/CodigosPython/appsisp',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/fgs/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']
Server time:    Sun, 30 Apr 2017 23:36:44 +0000
1 resposta

Bom dia! Pelo o que eu entendi da mensagem de erro, sisp_prova.curso_id esta recendo um valor NULL, ou seja, não esta sendo preenchido na ação.

Não esta claro para mim de onde vem o curso_id do seu formulário. Pelo fluxo, você escolhe um curso e a partir do ID do curso recebido pela sua action você precisa buscar o curso e fazer a associação com o objeto sisp. Algo nesse sentido.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software