from django import forms from django.urls import reverse_lazy from .models import Park from cities_light.models import Country, Region, City class ParkForm(forms.ModelForm): # Hidden fields for actual model relations country = forms.ModelChoiceField(queryset=Country.objects.all(), required=True, widget=forms.HiddenInput()) region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, widget=forms.HiddenInput()) city = forms.ModelChoiceField(queryset=City.objects.all(), required=False, widget=forms.HiddenInput()) # Visible fields for Awesomplete country_name = forms.CharField( label="Country", widget=forms.TextInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white', 'placeholder': 'Start typing a country name...', }) ) region_name = forms.CharField( label="Region/State", required=False, widget=forms.TextInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white', 'placeholder': 'Start typing a region/state name...', }) ) city_name = forms.CharField( label="City", required=False, widget=forms.TextInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white', 'placeholder': 'Start typing a city name...', }) ) class Meta: model = Park fields = ['name', 'country', 'region', 'city', 'description', 'owner', 'status', 'opening_date', 'closing_date', 'operating_season', 'size_acres', 'website'] widgets = { 'name': forms.TextInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white' }), 'description': forms.Textarea(attrs={ 'rows': 4, 'class': 'w-full border-gray-300 rounded-lg form-textarea dark:border-gray-600 dark:bg-gray-700 dark:text-white' }), 'owner': forms.Select(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-select dark:border-gray-600 dark:bg-gray-700 dark:text-white' }), 'status': forms.Select(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-select dark:border-gray-600 dark:bg-gray-700 dark:text-white' }), 'opening_date': forms.DateInput(attrs={ 'type': 'date', 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white' }), 'closing_date': forms.DateInput(attrs={ 'type': 'date', 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white' }), 'operating_season': forms.TextInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white', 'placeholder': 'e.g., Year-round, Summer only, etc.' }), 'size_acres': forms.NumberInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white', 'step': '0.01', 'min': '0' }), 'website': forms.URLInput(attrs={ 'class': 'w-full border-gray-300 rounded-lg form-input dark:border-gray-600 dark:bg-gray-700 dark:text-white', 'placeholder': 'https://example.com' }), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) instance = kwargs.get('instance') if instance: if instance.country: self.fields['country_name'].initial = instance.country.name self.fields['country'].initial = instance.country if instance.region: self.fields['region_name'].initial = instance.region.name self.fields['region'].initial = instance.region if instance.city: self.fields['city_name'].initial = instance.city.name self.fields['city'].initial = instance.city def clean(self): cleaned_data = super().clean() country_name = cleaned_data.get('country_name') region_name = cleaned_data.get('region_name') city_name = cleaned_data.get('city_name') if country_name: try: country = Country.objects.get(name__iexact=country_name) cleaned_data['country'] = country except Country.DoesNotExist: self.add_error('country_name', 'Invalid country name') if region_name and cleaned_data.get('country'): try: region = Region.objects.get( name__iexact=region_name, country=cleaned_data['country'] ) cleaned_data['region'] = region except Region.DoesNotExist: self.add_error('region_name', 'Invalid region name for selected country') if city_name and cleaned_data.get('region'): try: city = City.objects.get( name__iexact=city_name, region=cleaned_data['region'] ) cleaned_data['city'] = city except City.DoesNotExist: self.add_error('city_name', 'Invalid city name for selected region') return cleaned_data