Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Sobreescribir campo hijo en inlineformset_factory

Estas en el tema de Sobreescribir campo hijo en inlineformset_factory en el foro de Python en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/06/2015, 17:34
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 15 años
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
  #2 (permalink)  
Antiguo 16/06/2015, 01:40
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 15 años
Puntos: 1
Respuesta: Sobreescribir campo hijo en inlineformset_factory

Después de muchas pruebas y lectura la solución más fácil es sobreescribiendo los campos en el get_context_data.

Código Python:
Ver original
  1. def get_context_data(self, **kwargs):
  2.     context = super(CreateInvoiceProcedureView, self).get_context_data(**kwargs)
  3.     # override the child formset
  4.     for form in context['invoice_detail_form']:
  5.         form.fields['concept'].queryset = ConceptDetail.objects.filter(
  6.             Q(area__name=self.request.POST.get('area')) | Q(area__name='default')
  7.         )
  8.     return context

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:28.