Nessa aula vamos criar as funcionalidades de comentários e avaliação das aulas.

Crie a tabela comentários no banco de dados.

class Comentarios(models.Model):
    usuario = models.ForeignKey(Usuario, on_delete = models.DO_NOTHING)
    comentario = models.TextField()
    data = models.DateTimeField(default = datetime.now)
    aula = models.ForeignKey(Aulas, on_delete = models.DO_NOTHING)
    
    def __str__(self) -> str:
        return self.usuario.nome

Cadastre na área administrativa.

admin.site.register(Comentarios)

Crie uma URL comentários.

path('comentarios/', views.comentarios, name = 'comentarios'),

Crie a view comentarios.

def comentarios(request):
    usuario_id = int(request.POST.get('usuario_id'))
    comentario = request.POST.get('comentario')
    aula_id = int(request.POST.get('aula_id'))

    comentario_instancia = Comentarios(usuario_id = usuario_id,
                                       comentario = comentario,
                                       aula_id = aula_id)
    comentario_instancia.save()

    comentarios = Comentarios.objects.filter(aula = aula_id).order_by('-data')
    somente_nomes = [i.usuario.nome for i in comentarios]
    somente_comentarios = [i.comentario for i in comentarios]
    comentarios = list(zip(somente_nomes, somente_comentarios))

    return HttpResponse(json.dumps({'status': '1', 'comentarios': comentarios }))

em Aula.html:

{% extends 'base.html'%}

{% block 'titulo'%}
Aula

{% endblock%}

{% block 'body' %}

<div class="container">
  <br>

  <br>
  <h1>{{aula.nome}}</h1>
  <hr>
  <video  width="100%" controls>
      <source src="{{aula.aula.url}}" type="video/mp4">
    </video>
  <hr>

  <h1>Faça seu comentário: </h1>
  <input id="comentario" type="text" placeholder="Comentário..." class="form-control">
  <br>
  <input onclick="envia_comentario()" type="button" value="Enviar" class="btn btn-success btn-lg">
  <hr>
  <div id="comentarios">
    {% for i in comentarios%}
      <div style="background-color: red; width: 30px; height: 30px; border-radius: 15px; display: inline-block;"></div>
      <h5 style="display: inline;">{{i.usuario}}</h5>
      <p style="margin-left: 50px;">{{i.comentario}}</p>
      <hr>
    {% endfor %}
  </div>
 
 

</div>
<script src="<https://code.jquery.com/jquery-3.4.1.js>"></script>
<script>
function envia_comentario(){
   comentario = document.getElementById('comentario').value
   document.getElementById('comentario').value = ""
   $.ajax({
            url: "{% url 'comentarios'%}",
            method: 'post',
            data: {
                'csrfmiddlewaretoken': '{{ csrf_token }}',
                'aula_id': "{{aula.id}}",
                'usuario_id': "{{usuario_id}}",
                'comentario': comentario
            },
            success: function(resposta){
              resposta = JSON.parse(resposta)
              if(resposta['status'] == "1"){
                div_comentario = document.getElementById('comentarios')
                div_comentario.innerHTML = ""
                for(i=0; i < resposta['comentarios'].length; i++){
                  console.log('teste')
                  div_comentario.innerHTML += '<div style="background-color: red; width: 30px; height: 30px; border-radius: 15px; display: inline-block;"></div>'
                  div_comentario.innerHTML += '<h5 style="display: inline;">'+ resposta['comentarios'][i][0] +'</h5>'
                  div_comentario.innerHTML += '<p style="margin-left: 50px;">' + resposta['comentarios'][i][1] + '</p>'
                  div_comentario.innerHTML += '<hr>'

                }
              }

            }

        })
}
</script>
{% endblock %}

Agora vamos desenvolver o sistema de avaliação da aula.

Crie a tabela NotaAulas no banco de dados.

class NotasAulas(models.Model):
    choices = (
        ('p', 'Péssimo'),
        ('r', 'Ruim'),
        ('re', 'Regular'),
        ('b', 'bom'),
        ('o', 'Ótimo')
    )

    aula = models.ForeignKey(Aulas, on_delete=models.DO_NOTHING)
    nota = models.CharField(max_length=50, choices=choices)
    usuario = models.ForeignKey(Usuario, on_delete=models.DO_NOTHING)

Registre na área administrativa.

admin.site.register(NotasAulas)

Crie a seguinte URL.

path('processa_avaliacao/', views.processa_avaliacao, name = 'processa_avaliacao')

Não se esqueça da view.

def processa_avaliacao(request):
    if request.session.get('usuario'):

        avaliacao = request.POST.get('avaliacao')
        aula_id = request.POST.get('aula_id')
        
        usuario_id = request.session.get('usuario')

        usuario_avaliou = NotasAulas.objects.filter(aula_id = aula_id).filter(usuario_id = usuario_id)

        if not usuario_avaliou:
            nota_aulas = NotasAulas(aula_id = aula_id,
                                    nota = avaliacao,
                                    usuario_id = usuario_id,
                                    )
            nota_aulas.save()
            return redirect(f'/home/aula/{aula_id}')
        else:
            return redirect('/auth/login/')

    else:
        return redirect('/auth/login/')