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()