I currently have a model with 2 fields: Name & Number of Units
When the first field is selected e.g. Name = Name1
I would like to display the Number Of Units saved in association with that model. e.g. Name1 has 50 units
then the second < select > will show the number a list from 1 – 50 because Name1 has 50 units.
When I do this with my code currently , it lists the max number of units for every model entry instead
Please see the below code:
template.html:
<form> <select name="Complex"> {% for x in model %} <option value="{{ x }}">{{ x.ComplexName }}</option> {% endfor %} </select>> Complex <select> {% for x in model %} <option value="{{ x.NumberOfUnits }}">{{ x.NumberOfUnits }}</option> {% endfor %} </select> </form>
Views.py:
def customerDetails(request): model = ComplexListClass.objects.all().order_by('ComplexName') content = {'model': model} return render(request, 'main/customerDetails.html', content)
Models.py:
class ComplexListClass(models.Model): ComplexName = models.CharField(choices=complex_list , max_length = 50 ,default='1' , unique=True) NumberOfUnits = models.IntegerField(max_length=2 , blank=False , default=1 ) def __str__(self): return (self.ComplexName)
Advertisement
Answer
If you don’t want to go down the AJAX route, I’d suggest adding the maximum number of units to the first <select>
and making the NumberOfUnits
an Integer input field (with a minimum value validator of 1?). Form validation can further check that the number is not greater than the number available, which the user was already told about. Raise a validation error about exceeding the maximum.
<form> <select name="Complex"> {% for x in model %} <option value="{{ x }}"> {{ x.ComplexName }} ({{ x.NumberOfUnits }} available </option> {% endfor %} </select>> Complex {{form.number_of_units}}
and in your form override the clean
method to check
def clean(self): #get clean values from the form cleaned_data=super().clean() complex_name = cleaned_data['ComplexName') # t.b.s. get the maximum_units for this name here if cleaned_data['NumberOfUnits'] > maximum_units: raise forms.ValidationError( f"Only {maximum_units} available for {complex_name}" ) return cleaned_data