Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/06/2015, 17:34
paridin
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 15 años, 7 meses
Puntos: 1
Sobreescribir campo hijo en inlineformset_factory

Hola a todos,

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
  1. class Factura(models.Model):
  2.     factura = models.CharField()
  3.  
  4. class Detalle(models.Model):
  5.     concepto = models.ForeignKey("Concepto")
  6.     factura = models.ForeignKey("Factura")
  7.     cantidad = models.FloatField()
  8.  
  9. class Concepto(models.Model):
  10.     nombre = models.CharField()
  11.     area = models.ForeignKey()
  12.  
  13. class Area(models.Model):
  14.     nombre = models.CharField
  15.  
  16. # views.py
  17. class CreateInvoiceProcedureView(CreateView):
  18.     template_name = 'invoice/invoice_form.html'
  19.     model = Factura
  20.     def post(self, request, *args, **kwargs):
  21.         self.object = None
  22.         form = InvoiceForm(request=request)
  23.        
  24.         invoice_detail_form = InvoiceDetailFormSet(request.POST, instance=Factura,
  25.                                                request=request)
  26.         return self.render_to_response(
  27.             self.get_context_data(
  28.                 form=form,
  29.                 invoice_detail_form=invoice_detail_form
  30.             )
  31.         )
  32.  
  33.  
  34. class BaseFormSetInvoice(BaseInlineFormSet):
  35.     def __init__(self, *args, **kwargs):
  36.         # call first to retrieve kwargs values, when the class is instantiated
  37.         self.request = kwargs.pop("request")
  38.         super(BaseFormSetInvoice, self).__init__(*args, **kwargs)
  39.         # self.fields['concepto'] # envia error de que no existe fields
  40.         self.queryset.concepto = Detalle.objects.filter(
  41.             Q(concepto__area__name=self.request.POST.get('area')) | Q(concepto__area__name='default')
  42.         )  # devuelve toda la lista de conceptos, no estan siendo filtrados
  43.  
  44.        # self.queryset.concepto = Concepto.objects.filter(
  45.        #     Q(area__name=self.request.POST.get('area')) | Q(area__name='default')
  46.        # ) # devuelve toda la lista de concetos, no estan siendo filtrados
  47.  
  48. class InvoiceForm(forms.ModelForm):
  49.     class Meta:
  50.         model = Factura
  51.         fields = ('factura',)
  52.  
  53. class InvoiceDetailForm(forms.ModelForm):
  54.     class Meta:
  55.         model = Detalle
  56.         fields = ('concepto',)
  57.  
  58.  
  59. InvoiceDetailFormSet = inlineformset_factory(Factura, Detalle,
  60.                                              formset=BaseFormSetInvoice,
  61.                                              form=InvoiceDetailForm,
  62.                                              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'

Última edición por paridin; 09/06/2015 a las 17:57 Razón: agregar más detalle