#django
Вопрос:
Я совсем новичок в django и работаю в простом проекте для университета. Я пытаюсь использовать django-shapeshifter, но, просто введя, как в приведенном примере, я получаю синтаксическую ошибку.У меня есть одна основная таблица, подключенная к таблицам с множеством связей, и я хотел бы работать с одним представлением для работы с формами.
Модели:
class PreciosUnitarios(models.Model):
redimiento = models.ForeignKey(Rendimientos, on_delete=models.CASCADE)
mano_obra = models.ManyToManyField(ManoObra, through='PuManoObra')
material_id = models.ManyToManyField(Materiales, through='Pu_Material')
valor_mo = models.FloatField(
validators=[validate_decimals], blank=True, null=True)
valor_material = models.FloatField(
validators=[validate_decimals], blank=True, null=True)
def __str__(self) -> str:
return self.redimiento.nombre
def get_total(self):
return self.valor_mo self.valor_material
def get_absolute_url(self):
return reverse('pu_detail', kwargs={'pk': self.pk})
def save(self, *args, **kwargs):
if self.id:
pk = self.id
v = Variables.objects.get(pk=2)
rm = self.redimiento.unidades_jornal
jc = ManoObra.objects.get(cargo='Jefe de Cuadrilla')
pu_m = Pu_Material.objects.filter(pu_id=pk)
pu_mo = PuManoObra.objects.filter(pu_id=pk)
tm = pu_m.aggregate(Sum('subtotal'))['subtotal__sum']
tmo = pu_mo.aggregate(Sum('mo_subtotal'))['mo_subtotal__sum']
tmo = (tmo (((jc.salario*8)/208) * 0.10))/rm
total_herramientas = tmo * v.herramientas
total_seguridad = tmo * v.seguridad
subtotal = tm tmo total_herramientas total_seguridad
total = subtotal / (1 - v.gastos_admin)
total = total/(1-v.utilidad)
total = total*v.iva
self.valor_mo = total *
(tmo/(subtotal))
self.valor_material = total *
(tm/(subtotal))
super().save(*args, **kwargs)
else:
super().save(*args, **kwargs)
class PuManoObra(models.Model):
manoObra_id = models.ForeignKey(ManoObra, on_delete=models.CASCADE)
pu_id = models.ForeignKey(
PreciosUnitarios, on_delete=models.CASCADE, null=True, blank=True)
valor_jornal = models.FloatField(
validators=[validate_decimals], null=True, blank=True)
mo_subtotal = models.FloatField(
validators=[validate_decimals], null=True, blank=True)
ctd = models.PositiveIntegerField(default=1)
def __str__(self) -> str:
return self.pu_id.redimiento.nombre ", " self.manoObra_id.cargo
def save(self, *args, **kwargs):
vj = self.manoObra_id.salario/26
self.valor_jornal = vj
self.mo_subtotal = self.ctd*vj
super().save(*args, **kwargs)
class Pu_Material(models.Model):
material_id = models.ForeignKey(Materiales, on_delete=models.CASCADE)
pu_id = models.ForeignKey(
PreciosUnitarios, on_delete=models.CASCADE, null=True, blank=True)
cantidad = models.PositiveIntegerField(default=1)
subtotal = models.FloatField(
validators=[validate_decimals], null=True, blank=True)
class Meta():
unique_together = [['material_id', 'pu_id']]
def __str__(self) -> str:
return self.pu_id.redimiento.nombre ", Material: " self.material_id.material_nombre
def save(self, *args, **kwargs):
self.subtotal = self.material_id.precio*self.cantidad
super().save(*args, **kwargs)
мои формы:
class PrecioUnitarioForm(forms.ModelForm):
class Meta():
model = PreciosUnitarios
fields = ('redimiento',
# 'mano_obra',
# 'material_id',
# 'valor_mo',
# 'valor_material'
)
labels = {
'redimiento': 'Selecionar Rendimiento',
'mano_obra': 'Selecionar Mano de Obra',
'material_id': '',
'valor_mo': '',
'valor_material': '',
}
widgets = {
'redimiento': forms.Select(attrs={'class': 'form-control'}),
'mano_obra': forms.SelectMultiple(attrs={'class': 'form-control'}),
'material_id': forms.SelectMultiple(attrs={'class': 'form-control'}),
'valor_mo': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Precio del Material'}),
'valor_material': forms.TextInput(attrs={'class': 'form-control'}),
}
class PuMaterialForm(forms.ModelForm):
class Meta():
model = Pu_Material
fields = (
'material_id', 'pu_id', 'cantidad'
)
labels = {
'material_id': 'Material', 'pu_id': 'Preciounitario', 'cantidad': ''
}
widgets = {
'material_id': forms.Select(attrs={'class': 'form-control'}),
'pu_id': forms.Select(attrs={'class': 'form-control'}),
'cantidad': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Cantidad'})
}
class PuManoObraForm(forms.ModelForm):
class Meta():
model = PuManoObra
fields = (
'manoObra_id', 'pu_id', 'ctd'
)
labels = {'manoObra_id': 'Mano de Obra',
'pu_id': 'Precio Unitario',
'ctd': ''
}
widgets = {
'manoObra_id': forms.Select(attrs={'class': 'form-control'}),
'pu_id': forms.Select(attrs={'class': 'form-control'}),
'ctd': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Cantidad'})
}
the shapeshift code:
class PrecioUnitarioFormView(MultiModelFormView):
form_classes = ('PrecioUnitarioForm', 'PuMaterialForm', 'PuManoObraForm')
template_name = 'cotizacion/preciosunitarios.html'
success_url = 'cotizacion/pu_detail.html'
success_message = ''
def get_instances(self):
instances = {
'preciounitariofomr': self.request.preciosunitarios,
'pumaterialform': Pu_Material.objects.filter(
user=self.request.preciosunitarios).first(),
'pumanoobraform': PuManoObra.objects.filter(
user=self.request.preciosunitarios).first()
}
return instances
the error says that «object has no attribute name«.
Anyone can help?