Error IntegrityError: NOT NULL constraint failed in Django

0

I want a form to add groups of clients and in turn add clients to these groups, for this I have created the field people in manytomany and using an intermediary Group_member.

models.py

    class Grupo(models.Model):
        nombre_grupo        = models.CharField(max_length=30)
        observaciones       = models.TextField(blank=True,null=True)
        personas            = models.ManyToManyField(Persona,blank=True, through='Grupo_miembro')
        asignado_a          = models.ForeignKey(User, null=True, blank=True,related_name='asignado_por')
        creado_por          = models.ForeignKey(User, null=True, blank=True,related_name='creado_por')
        fecha_creacion      = models.DateTimeField(default=timezone.now)
        activo              = models.NullBooleanField(default=True)

        def __unicode__(self):      
            return self.nombre_grupo

        class Meta:
            permissions = (
                # Identificador     Descripción del permiso
                ("view_grupo",        "Puede ver y/o consultar grupos"),
            )

    class Tipo_miembro(models.Model):
        tipo_miembro    = models.CharField(max_length=30)
        activo          = models.NullBooleanField(default=True)

        def __unicode__(self):      
            return self.tipo_miembro

    class Grupo_miembro(models.Model):
        persona = models.ForeignKey(Persona, on_delete=models.CASCADE)
        grupo   = models.ForeignKey(Grupo, on_delete=models.CASCADE)
        tipo_miembro = models.ForeignKey(Tipo_miembro, on_delete=models.CASCADE)

        def __unicode__(self):      
            return '%s -> %s | %s ' % (self.persona, self.grupo, self.tipo_miembro)

Then I make a form to add members to the group, excluding group, since it assumes that it is automatic and the user does not have to choose it, to validate the gormulario I require the group so I call it with a init_

forms.py

    class formAgregarMiembroGrupo(forms.ModelForm):
        persona         = forms.ModelChoiceField(queryset=Persona.objects.all(),widget=forms.Select(attrs={'class':'s2 form-control'}))
        #grupo           = forms.ModelChoiceField(queryset=Grupo.objects.all(),widget=forms.Select(attrs={'class':'s2 form-control'}))
        tipo_miembro    = forms.ModelChoiceField(queryset=Tipo_miembro.objects.all(),widget=forms.Select(attrs={'class':'s2 form-control'}))

        class Meta:
            model = Grupo_miembro
            fields = ('persona','tipo_miembro')
            exclude = ('grupo',)

        def __init__(self, pk, *args, **kwargs):
            super(formAgregarMiembroGrupo, self).__init__(*args, **kwargs)
            self.grupo = pk

        def clean_persona(self):
            miembro = self.cleaned_data['persona']
            g = self.grupo
            cargo   = self.data['tipo_miembro']

            #Verificar si el cliente ya fue agregado al grupo 
            if Grupo_miembro.objects.filter(grupo=g).filter(persona=miembro).exists():
                raise ValidationError('Cliente ya está en el Grupo')

            return miembro

        def clean_tipo_miembro(self):
            cargo   = self.cleaned_data['tipo_miembro']
            miembro = self.data['persona']
            g       = self.grupo

            if Grupo_miembro.objects.filter(grupo=g).exists():
                r = Tipo_miembro.objects.get(tipo_miembro='Responsable')
                responsable = Grupo_miembro.objects.filter(grupo=g).get(tipo_miembro=r.id).persona

                #Verificar si el grupo ya tiene responsable asignado
                if str(cargo) == r.tipo_miembro:
                    if Grupo_miembro.objects.filter(grupo=g).filter(tipo_miembro=r.id).exclude(persona=miembro).exists():
                        raise ValidationError('El Grupo ya tiene un responsable asignado: %s'% (responsable))   

            return cargo

In the view before saving the form I assigned pk to form.group before the save, but apparently it is not working.

views.py

    def Ajax_AgregarMiembrosGrupo(request, pk):
        data = dict()
        if request.method == 'POST':

            form = formAgregarMiembroGrupo(pk,request.POST)
            if form.is_valid():
                form.save(commit=False)
                form.grupo = pk
                form.save()

                data['form_is_valid'] = True
                data['miembro'] = str(form.cleaned_data['persona'])
                data['grupo'] = str(pk)

                if Grupo_miembro.objects.all().exists():
                    miembros = Grupo_miembro.objects.filter(grupo=pk)
                data['html_miembros_list'] = render_to_string('personas/ajax/grupo.miembros.lista.html', {
                    'miembros': miembros, 'grupo':pk
                })
            else:
                data['form_is_valid'] = False
                messages.warning(request, 'Corregir los errores')
        else:
            form = formAgregarMiembroGrupo(pk)

        contexto = {'form':form,'grupo':pk }

        data['html_form'] = render_to_string('personas/ajax/grupo.miembros.agregar.html', contexto, request=request)

        return JsonResponse(data)

I get the following error:

File "/home/ubuntu/workspace/core/personas/views.py", line 291, in Ajax_AddMembersGroup     form.save ()

IntegrityError: NOT NULL constraint failed: people_group_member.group_id [23 / Oct / 2017 23:18:42] "POST / groups / 6 / members / Ajax_AddMembersGroup / HTTP / 1.1" 500 18650

Update: I have corrected it in the following way:

    if form.is_valid():
        add_grupo = form.save(commit=False)
        add_grupo.grupo = Grupo.objects.get(pk=pk)
        add_grupo.save()
    
asked by Ernestoruiz89 24.10.2017 в 07:31
source

1 answer

0

Update: I have corrected it in the following way:

if form.is_valid():
    add_grupo = form.save(commit=False)
    add_grupo.grupo = Grupo.objects.get(pk=pk)
    add_grupo.save()
    
answered by 28.10.2017 / 21:30
source