Espero me puedan ayudar a resolver esta duda,
Tengo tres clases, Factura, Detalle y Concepto lo que debo hacer es filtrar mediante un request.POST los conceptos del detalle que pertenecen al área.
Código Python:
Ver original
class Factura(models.Model): factura = models.CharField() class Detalle(models.Model): concepto = models.ForeignKey("Concepto") factura = models.ForeignKey("Factura") cantidad = models.FloatField() class Concepto(models.Model): nombre = models.CharField() area = models.ForeignKey() class Area(models.Model): nombre = models.CharField # views.py class CreateInvoiceProcedureView(CreateView): template_name = 'invoice/invoice_form.html' model = Factura def post(self, request, *args, **kwargs): self.object = None form = InvoiceForm(request=request) invoice_detail_form = InvoiceDetailFormSet(request.POST, instance=Factura, request=request) return self.render_to_response( self.get_context_data( form=form, invoice_detail_form=invoice_detail_form ) ) class BaseFormSetInvoice(BaseInlineFormSet): def __init__(self, *args, **kwargs): # call first to retrieve kwargs values, when the class is instantiated self.request = kwargs.pop("request") super(BaseFormSetInvoice, self).__init__(*args, **kwargs) # self.fields['concepto'] # envia error de que no existe fields self.queryset.concepto = Detalle.objects.filter( Q(concepto__area__name=self.request.POST.get('area')) | Q(concepto__area__name='default') ) # devuelve toda la lista de conceptos, no estan siendo filtrados # self.queryset.concepto = Concepto.objects.filter( # Q(area__name=self.request.POST.get('area')) | Q(area__name='default') # ) # devuelve toda la lista de concetos, no estan siendo filtrados class InvoiceForm(forms.ModelForm): class Meta: model = Factura fields = ('factura',) class InvoiceDetailForm(forms.ModelForm): class Meta: model = Detalle fields = ('concepto',) InvoiceDetailFormSet = inlineformset_factory(Factura, Detalle, formset=BaseFormSetInvoice, form=InvoiceDetailForm, extra=1)
He utilizado inlineformset_factory para trabajar con esto, pero no puedo sobreescribir el campo concepto, para poder filtrar, es posible hacerlo, estoy usando la herencia de BaseInlineFormSet por que leí que desde ella puedo hacerlo, sin embargo sólo he obtenido los siguientes errores
Código:
django.core.exceptions.ValidationError: ['ManagementForm data is missing or has been tampered with'] 'InvoiceDetailFormFormSet' object has no attribute 'fields'