Advertisement
losvilos

forms.py

Mar 14th, 2025
80
0
20 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.63 KB | Help | 0 0
  1. from django import forms
  2. from django.forms import inlineformset_factory
  3. from .models import Cliente, Contrato, Servicio, Zona, DireccionInstalacion
  4.  
  5. class ClienteForm(forms.ModelForm):
  6.     class Meta:
  7.         model = Cliente
  8.         fields = '__all__'
  9.  
  10.     def clean_numero_documento(self):
  11.         numero_documento = self.cleaned_data.get("numero_documento")
  12.         cliente_id = self.instance.pk  # Obtener el ID del cliente si es edición
  13.  
  14.         # Verificar si el número de documento ya existe en otro cliente
  15.         if Cliente.objects.exclude(pk=cliente_id).filter(numero_documento=numero_documento).exists():
  16.             raise forms.ValidationError("Este número de documento ya está registrado.")
  17.  
  18.         return numero_documento
  19.  
  20.  
  21. class DireccionForm(forms.ModelForm):
  22.     class Meta:
  23.         model = DireccionInstalacion
  24.         fields = ['zona', 'direccion']
  25.         widgets = {
  26.             'direccion': forms.TextInput(attrs={'placeholder': 'Ej: Calle 123, Edificio A'}),
  27.         }
  28.  
  29.  
  30. DireccionFormSet = inlineformset_factory(
  31.     Cliente,
  32.     DireccionInstalacion,
  33.     form=DireccionForm,
  34.     extra=1,  # Número mínimo de direcciones a mostrar
  35.     can_delete=True
  36. )
  37.  
  38. class ContratoForm(forms.ModelForm):
  39.     class Meta:
  40.         model = Contrato
  41.         fields = ['cliente', 'direccion', 'fecha_inicio', 'fecha_fin', 'monto']
  42.  
  43.     def __init__(self, *args, **kwargs):
  44.         super().__init__(*args, **kwargs)
  45.         # Inicializa el campo de dirección si ya hay un cliente seleccionado
  46.         if self.instance and self.instance.cliente:
  47.             self.fields['direccion'].initial = self.instance.cliente.direccion
  48.     class Meta:
  49.         model = Contrato
  50.         fields = ['cliente', 'direccion', 'fecha_inicio', 'fecha_fin', 'monto']
  51.  
  52.     def __init__(self, *args, **kwargs):
  53.         super().__init__(*args, **kwargs)
  54.         # Inicializa el campo de dirección si ya hay un cliente seleccionado
  55.         if self.instance and self.instance.cliente:
  56.             self.fields['direccion'].initial = self.instance.cliente.direccion
  57.     servicios = forms.ModelMultipleChoiceField(
  58.         queryset=Servicio.objects.all(),
  59.         widget=forms.CheckboxSelectMultiple(),
  60.         required=True,
  61.         label="Servicios contratados"
  62.     )
  63.  
  64.     fecha_contratacion = forms.DateField(
  65.         widget=forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
  66.         label="Fecha de contratación"
  67.     )
  68.  
  69.     # Nuevo campo para seleccionar el día de pago (del 1 al 30)
  70.     dia_pago = forms.ChoiceField(
  71.         choices=[(i, i) for i in range(1, 31)],
  72.         required=False,
  73.         label="Día de pago",
  74.         widget=forms.Select(attrs={'class': 'form-control'})
  75.     )
  76.  
  77.     direccion_instalacion = forms.ModelChoiceField(
  78.         queryset=DireccionInstalacion.objects.none(),
  79.         widget=forms.Select(attrs={'class': 'form-control'}),
  80.         required=True,
  81.         label="Dirección de instalación"
  82.     )
  83.  
  84.     class Meta:
  85.         model = Contrato
  86.         fields = [
  87.             'cliente', 'direccion_instalacion', 'numero_abonado',
  88.             'fecha_contratacion', 'dia_pago', 'dias_gracia',
  89.             'servicios', 'descripcion'
  90.         ]
  91.         widgets = {
  92.             'cliente': forms.Select(attrs={'class': 'form-control'}),
  93.             'numero_abonado': forms.TextInput(attrs={'class': 'form-control'}),
  94.             'dias_gracia': forms.NumberInput(attrs={'class': 'form-control'}),
  95.             'descripcion': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}),
  96.         }
  97.  
  98.     def __init__(self, *args, **kwargs):
  99.         cliente_id = kwargs.pop('cliente_id', None)
  100.         super().__init__(*args, **kwargs)
  101.        
  102.         # Carga direcciones según cliente seleccionado
  103.         if cliente_id:
  104.             self.fields['direccion_instalacion'].queryset = DireccionInstalacion.objects.filter(cliente_id=cliente_id)
  105.         else:
  106.             self.fields['direccion_instalacion'].queryset = DireccionInstalacion.objects.none()
  107.  
  108.         # Aquí añadimos el precio de cada servicio como atributo personalizado
  109.         self.fields['servicios'].queryset = Servicio.objects.all()
  110.         for servicio in self.fields['servicios'].queryset:
  111.             self.fields['servicios'].widget.attrs.update({
  112.                 f'data-precio-{servicio.pk}': servicio.precio
  113.             })
  114.  
  115.  
  116. class ServicioForm(forms.ModelForm):
  117.     class Meta:
  118.         model = Servicio
  119.         fields = ['nombre', 'precio']
  120.         widgets = {
  121.             'nombre': forms.TextInput(attrs={'class': 'form-control'}),
  122.             'precio': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
  123.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement