I have a Django ModelForm as below. Primary objective is to select area pincode based on selected "state". I don't seem to find a way how can I filter Pincode based on a dynamic queryset on the chosen state. form_valid() method in CreateView is not invoked until the entire form is submitted.
template
<form method='POST' action="">{% csrf_token %}
{{ form|crispy }}
view.py
class UserAddressCreateView(FormView):
form_class = UserAddressForm
template_name = "user_address_form.html"
success_url = "/checkout/address/"
forms.py
class UserAddressForm(forms.ModelForm):
class Meta:
model = UserAddress
fields = '__all__'
state = forms.ModelChoiceField(
widget=forms.Select,
queryset=StateCode.objects.all(),
)
place = forms.ModelChoiceField(
widget=forms.Select,
queryset=PinCode.objects.none(),
)
def clean(self):
cleaned_data = super(UserAddressForm,self).clean()
state = cleaned_data.get("state")
return cleaned_data
def __init__(self, *args, **kwargs):
super(UserAddressForm, self).__init__(*args, **kwargs)
self.fields["place"].queryset = PinCode.objects.filter(state="KARNATAKA")
models.py
class UserAddress(models.Model):
user = models.ForeignKey(UserCheckout)
type = models.CharField(max_length=20, choices=ADDRESS_TYPE)
address = models.CharField(max_length=120, null=True,blank=True)
mobile = models.CharField(max_length=120, null=True,blank=True)
state = models.ForeignKey(StateCode,null=True,blank=True)
place = models.ForeignKey(PinCode,null=True,blank=True)
class StateCode(models.Model):
state = models.CharField(max_length=120, blank=True)
code = models.CharField(max_length=120, blank=True)
class PinCode(models.Model):
place = models.CharField(max_length=120, blank=True)
pincode = models.CharField(max_length=120, blank=True)
officeType = models.CharField(max_length=120, blank=True)
Deliverystatus = models.CharField(max_length=120, blank=True)
divisionname = models.CharField(max_length=120, blank=True)
regionname = models.CharField(max_length=120, blank=True)
circle = models.CharField(max_length=120, blank=True)
Taluk = models.CharField(max_length=120, blank=True)
district = models.CharField(max_length=120, blank=True)
state = models.CharField(max_length=120, blank=True)
Telephone = models.CharField(max_length=120, blank=True)
Related_Suboffice = models.CharField(max_length=120, blank=True)
Related_Headoffice = models.CharField(max_length=120, blank=True)