I need you to help me please with an error that I get, I have tried to put them related_names
but the same error keeps coming up. (I use Django 1.6.5 and Python 2.7)
Mistake:
My models:
class Novedad(models.Model):
persona = models.ForeignKey(Persona, related_name="persona")
responsable = models.ForeignKey(Persona, related_name="responsable")
municipio = models.ForeignKey(Municipio)
area = models.ForeignKey(Area) # área de ocurrencia de la novedad
cargo = models.ForeignKey(Cargo) # cargo ejercido el dia de la novedad
sucursal = models.ForeignKey(Sucursal)
fecha_diligenciamiento = models.DateTimeField(auto_now_add=True, blank=True)
observaciones = models.TextField(blank=True, null=True)
class Meta:
abstract = True
class AusentismoBase(Novedad):
fecha_inicio = models.DateField(verbose_name="Fecha Inicial")
fecha_fin = models.DateField(verbose_name="Fecha Final")
mes = models.IntegerField(validators=[no_negativo])
quincena = models.IntegerField(validators=[no_negativo])
hora_inicio = models.TimeField(verbose_name="Hora Inicial", blank=True, null=True)
hora_fin = models.TimeField(verbose_name="Hora Final", blank=True, null=True)
motivo = models.IntegerField(choices=MOTIVOS_AUSENTISMO, verbose_name="Tipo de Ausentismo")
eps = models.ForeignKey(Eps)
arl = models.ForeignKey(Arl)
edad = models.IntegerField(validators=[no_negativo])
salario = models.IntegerField(validators=[no_negativo])
#jornada = models.IntegerField(choices=JORNADAS, verbose_name="Jornada")
def __unicode__(self):
return (u"Ausentismo %s: %s - %s)"%(self.persona, self.motivo, self.fecha_inicio)).strip() or "-"
class Reintegro(Novedad):
area_seleccionada = models.ForeignKey(Area, related_name="area_seleccionadaR", verbose_name="nueva área seleccionada")
cargo_seleccionado = models.ForeignKey(Cargo, related_name="cargo_seleccionadoR", verbose_name="nuevo cargo seleccionado")
fecha_ingreso = models.DateField()
tipo_empleado = models.CharField(max_length=1, choices=TIPO_EMPLEADO)
My only form (for now):
class AusentismoBaseForm(forms.ModelForm):
class Meta:
model = AusentismoBase
exclude = ('persona', 'responsable', 'area', 'cargo', 'sucursal', 'mes', 'quincena', 'eps', 'arl', 'edad', 'salario')
widgets = {
'municipio': Select2Widget(),
'fecha_inicio' : MyDateWidget(),
'fecha_fin' : MyDateWidget(),
'hora_inicio': TimeWidget(usel10n=False, bootstrap_version=3),
'hora_fin': TimeWidget(usel10n=False, bootstrap_version=3),
#'soporte' : MyFileInput(),
'observaciones': Textarea(attrs={'cols': 30, 'rows': 2}),
}
My only view (for now):
def crear_ausentismo(request, idPersona=None):
persona = None
hoy = datetime.now()
form = AusentismoBaseForm()
form2 = CedulaForm(request.POST)
if(idPersona):
persona = Persona.objects.get(id=idPersona)
form = AusentismoBaseForm(request.POST)
if form.is_valid():
print("dió clic")
objeto = form.save(commit=False)
objeto.persona = persona
objeto.responsable = Persona.objects.get(usuario=request.user)
objeto.area = persona.cargo.area
objeto.cargo = persona.cargo
objeto.sucursal = persona.sucursal
objeto.mes = hoy.month
if hoy.day >= 16:
objeto.quincena = 2
else:
objeto.quincena = 1
objeto.eps = persona.eps
objeto.arl = persona.arl
objeto.edad = edad(persona)
objeto.salario = persona.salario
objeto.save()
form.save()
return redirect('crear_ausentismo', persona.id)
else:
print("aún no da clic")
form = AusentismoBaseForm()
form2 = CedulaForm()
else:
if form2.is_valid():
persona = form2.cleaned_data['persona']
return redirect('crear_ausentismo', persona.id)
else:
try:
form2 = CedulaForm({'persona': persona.id})
except Exception:
form2 = CedulaForm()
return render(request, 'ausentismo.html', {
'persona': persona,
'form': form,
'form2': form2,
'hoy': hoy,
})
The problem is that both
AusentismoBase
areReintegro
using the samerelated_name
for the fieldspersona
andresponsable
but this is the expected behavior since it is an abstract class.To solve it you can modify those
related_name
of your abstract class so that they contain the name of the class that inherits it:So now the reverse queries for an instance of
Persona
would beFor the field
persona
:For the field
responsable
: