forms.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from django import forms
  2. from decimal import Decimal, InvalidOperation
  3. from .models import Movimiento, Cuenta
  4. class MovimientoForm(forms.ModelForm):
  5. monto = forms.CharField()
  6. class Meta:
  7. model = Movimiento
  8. fields = ['cuenta_origen', 'cuenta_destino', 'monto', 'fecha', 'descripcion']
  9. widgets = {
  10. 'cuenta_origen': forms.Select(attrs={'class': 'form-control'}),
  11. 'cuenta_destino': forms.Select(attrs={'class': 'form-control'}),
  12. 'monto': forms.TextInput(attrs={'class': 'form-control'}),
  13. 'descripcion': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
  14. 'fecha': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control', 'placeholder': 'MM-DD-YYYY'}, format='%d-%m-%YT%H:%M'),
  15. }
  16. def clean(self):
  17. cleaned_data = super().clean()
  18. origen = cleaned_data.get('cuenta_origen')
  19. destino = cleaned_data.get('cuenta_destino')
  20. if origen and destino and origen == destino:
  21. raise forms.ValidationError("La cuenta de origen y la de destino no pueden ser la misma.")
  22. def __init__(self, *args, **kwargs):
  23. super().__init__(*args, **kwargs)
  24. self.fields['fecha'].input_formats = ['%d-%m-%YT%H:%M']
  25. if 'monto' in self.initial:
  26. self.initial['monto'] = str(self.initial['monto']).replace('.', ',')
  27. elif self.instance and self.instance.pk:
  28. self.fields['monto'].initial = str(self.instance.monto).replace('.', ',')
  29. def clean_monto(self):
  30. valor = self.cleaned_data['monto'].replace(',', '.')
  31. try:
  32. return Decimal(valor)
  33. except InvalidOperation:
  34. raise forms.ValidationError("Introduzca un número válido. Puede usar coma o punto como separador decimal.")
  35. class FiltroForm(forms.Form):
  36. # fecha_inicio = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
  37. # fecha_fin = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
  38. # cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), required=False)
  39. buscar = forms.CharField(required=False, label='',
  40. widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Buscar...'}))
  41. class CuentaForm(forms.ModelForm):
  42. saldo = forms.CharField()
  43. class Meta:
  44. model = Cuenta
  45. fields = ['nombre', 'tipo', 'saldo', 'favorita']
  46. widgets = {
  47. 'nombre': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'El nombre de la cuenta'}),
  48. 'tipo': forms.Select(attrs={'class': 'form-control'}),
  49. 'saldo': forms.TextInput(attrs={'class': 'form-control'}),
  50. 'favorita': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
  51. }
  52. def __init__(self, *args, **kwargs):
  53. super().__init__(*args, **kwargs)
  54. if 'saldo' in self.initial:
  55. self.initial['saldo'] = str(self.initial['saldo']).replace('.', ',')
  56. elif self.instance and self.instance.pk:
  57. self.fields['saldo'].initial = str(self.instance.saldo).replace('.', ',')
  58. def clean_saldo(self):
  59. valor = self.cleaned_data['saldo'].replace(',', '.')
  60. try:
  61. return Decimal(valor)
  62. except InvalidOperation:
  63. raise forms.ValidationError("Introduzca un número válido. Use coma o punto como separador decimal.")