mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 14:31:08 -05:00
126 lines
5.6 KiB
Python
126 lines
5.6 KiB
Python
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
|