I am a Django learner. I don’t have much knowledge on Jquery & Ajax.
I am getting below error when user selects the field from the populated data and submit the form.
“Select a valid choice. ['G712'] is not one of the available choices.”
Looks it is due to some issue during server side form validation but I could not found what is the exact root cause.
I am developing a Django application with below scenario.
Create a model named ModelRegister to define the list of models which has fields model name, model no, os name, os version ,chipset type , chipset name etc as defined below
-------------------------------------------------------------------------------------------------------------------------------------------------
1.class ModelRegister(models.Model):
"""
This class is used to register
the model.
"""
FLOAT_CHOICES = [[float(x), float(x)] for x in range(1, 21)]
model_leader = models.CharField("Model leader", max_length=128)
model_name = models.CharField(max_length=128, verbose_name="ModelName")
model_no = models.CharField(max_length=128, verbose_name="ModelNo")
os_name = models.ForeignKey(OSName, on_delete=models.CASCADE, verbose_name="OSName)
os_version = models.FloatField(choices=FLOAT_CHOICES)
chipset_type =
models.ForeignKey(ChipsetType,on_delete=models.CASCADE,verbose_name="chipsetType")
chipset_name =
models.ManyToManyField(Chipset)
class Meta:
verbose_name_plural = "ModelRegisteredList"
def __str__(self):
return self.model_name
2.create another model named ModelGSPRequest to raise a model gsp request which has model name,model no and os name ,model_gsp_requester,integrator ,region etc
class ModelGSPRequest(models.Model):
"""
This class is used to raise Model GSP request.
"""
registered_model = models.CharField("select model name", max_length=128)
registered_model_no = models.CharField("select model no", max_length=128)
registered_model_os_name = models.CharField("select os name",max_length=128)
registered_chipset_type = models.ForeignKey(ChipsetType, on_delete=models.CASCADE, verbose_name="chipsetType")
registered_chipset_name = models.ManyToManyField(Chipset)
model_gsp_requester = models.CharField("Model GSP Requester", max_length=128)
integrator = models.CharField("Integrator", max_length=100)
class Meta:
verbose_name_plural = "ModelGSPRequests"
def __str__(self):
return self.model_gsp_requester + self.integrator + str(self.pk)
|
ModelRegister |
|
|
|
|
ModelName |
ModelNo |
OSName |
chipset |
|
G1 |
G100 |
O |
qct |
|
G2 |
G110 |
O |
qct |
|
G5 |
H850 |
O |
qct |
|
G5 |
H860 |
O |
qct |
|
G5 |
H850 |
P |
qct |
|
G5 |
H860 |
P |
qct |
Lets assume this is the ModelRegister data stored in the database.
Now from ModelGSPRequest model, I need registered_model to populate with the unique values from model_name in ModelRegister .
Based on selection of model from registered_model , registered_model_no should populate with unique values of selected model.
For Example, If selected model from registered_model is G5 from the above table .registered_model_no should populate with values : H850, H860 and user can either or both of them while raising from ModelGSPRequest .
To accomplish this requirement, i have written an Ajax function named `load_model_details` which triggers when there is a change in the model name drop down selection. Through this method, i got all the model instances for the selected model & then i am passing it as a context to `model_info_options.html` to get the model number and OS Name details for the selected model.
Below is the code for forms.py
---------------------------------------
def unique_model_names():
return [("","---------------")]+list(ModelRegister.objects.values_list('model_name','model_name').order_by('model_name').distinct())
def unique_model_numbers():
return list(ModelRegister.objects.values_list('model_no','model_no').order_by('model_no').distinct())
def unique_os_names():
return list(ModelRegister.objects.values_list('os_name','os_name').order_by('os_name').distinct())
class ModelGSPRequestForm(ModelForm):
"""
This class is used to define the form fields to raise the model GSP request.
"""
registered_model = forms.ChoiceField(required=False, choices=unique_model_names,widget=forms.Select)
registered_model_no = forms.ChoiceField(required=False, widget=forms.SelectMultiple)
class Meta:
model = ModelGSPRequest
exclude = ['model_gsp_requester']
def clean(self):
registered_model = self.cleaned_data.get('registered_model')
registered_model_no = self.cleaned_data.get('registered_model_no')
print("clean Method :ModelGSPRequestForm:", registered_model)
print("clean Method :ModelGSPRequestFor:", registered_model_no)
def __init__(self, *args, **kwargs):
super(ModelGSPRequestForm, self).__init__(*args, **kwargs)
#self.form_tag = False
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset("Add Model GSP Request",
Row('registered_model','registered_model_no','registered_model_os_name',
'registered_chipset_type',registered_chipset_name','integrator',
)
)
)
self.fields['registered_model_no'].queryset = ModelNumber.objects.none()
ModelGSPRequestFormSet = modelformset_factory(ModelGSPRequest, form=ModelGSPRequestForm, extra=1, can_delete=True)
ajax.py:
---------
Below is the code snippet used get the model instances for the selected model
def load_model_details(request):
context = {}
modelname = request.GET.get("model")
context["modelnos_for_model"] = list(ModelRegister.objects.filter(model_name=modelname).values_list('model_no',
flat=True).order_by('model_no').distinct())
return HttpResponse(json.dumps(context),content_type="application/json")
views.py:--------- def create_model_gsp_request_form(request,id=None):
print("Inside create_model_gsp_request_form")
template_name = "ModelGSPRequest.html"
heading_message = "ModelGSPRequest"
if id:
action = 'edit'
model = get_object_or_404(ModelGSPRequest, pk=id)
else:
action = 'submit'
model = ModelGSPRequest()
message = ""
if request.method == 'GET':
print("Get request in create_model_gsp_request_form")
formset = ModelGSPRequestFormSet()
elif request.method == 'POST':
print("post request in create_model_gsp_request_form")
formset = ModelGSPRequestFormSet(request.POST,request.FILES)
if formset.is_valid():
for form in formset:
# only save if name is present
if form.cleaned_data.get('registered_model'):
new_form = form.save(commit=False)
new_form.model_gsp_requester = request.user.username
new_form.save()
formset.save_m2m()
#return redirect('ModelGSPRequestList')
return HttpResponseRedirect('/gspapp/ModelGSPRequestList')
return render(request, template_name, {
'formset': formset,
'heading': heading_message,
#'registered_model_data': registered_model_details,
'action':action
})
ModelGSPRequest.html:--------------------<!DOCTYPE html>
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block static %}
{% endblock static %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
<div class="container">
{{ formset.management_form }}
<table class="table">
{% for form in formset.forms %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tr class="{% cycle row1 row2 %} formset_row">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<button type="submit" class="btn btn-primary">
{% if action == "submit" %}
<span class="fas fa-plus"></span>Submit
{% else %}
<span class="fas fa-edit"></span>Update
{% endif %}
</button>
</div>
</form>
{% endblock content %}
{% block scripts %}
<script type="text/javascript">
$('.formset_row').formset({
addText: 'add model gsp request',
deleteText: 'remove',
prefix: 'modelgsp_set'
});
</script>
<script type="text/javascript">
$("#id_form-0-registered_model").change(function () {
var modelname = $(this).val(); // get the selected model from the HTML input
console.log(modelname);
$.ajax({ // initialize an AJAX request
url: "load_model_details", // set the url of the request (= localhost:8000/hr/ajax/load-cities/)
data: {
'model': modelname // add the modelname to the GET parameters
},
success: function (result) { // `data` is the return of the `load_model_details` view function
// empty the model no multiple select field
$("#id_form-0-registered_model_no").empty()
// $("#id_form-0-registered_model_no").html(data); // replace the contents of the city input with the data that came from the server
$.each(result.modelnos_for_model, function(index,value){
$("#id_form-0-registered_model_no").append('<option value="'+value+'">'+value+'</option>')
});
}
});
});
$("#id_form-0-registered_model_no").change(function () {
var modelnos = []; // get the selected modelno from the HTML input
$.each($("#id_form-0-registered_model_no option:selected"),function(){
modelnos.push($(this).val());
});
console.log("selected modelnumbers are:" + modelnos.join(","));
$.ajax({ // initialize an AJAX request
url: "load_os_details", // set the url of the request (= localhost:8000/hr/ajax/load-cities/)
data: {
'model_nos': modelnos // add the modelname to the GET parameters
},
success: function (data) { // `data` is the return of the `load_os_details` view function
$("#id_form-0-registered_model_os_name").html(data);
}
});
});
</script>
{% endblock scripts %}
Please find the screen shot for the scenario where I am getting the error:
I am a Django learner. I don’t have much knowledge on
Jquery & Ajax.
I am getting below error when user selects the field from the populated data and submit the form.
“Select a valid choice. ['G712'] is not one of the available choices.”
Looks it is due to some issue during server side form validation but I could not found what is the exact root cause.
I am developing a Django application with below scenario.
Create a model named ModelRegister to define the list of models which has fields model name, model no, os name, os version ,chipset type , chipset name etc as defined below
-------------------------------------------------------------------------------------------------------------------------------------------------
1.class ModelRegister(models.Model):
"""
This class is used to register
the model.
"""
FLOAT_CHOICES = [[float(x), float(x)] for x in range(1, 21)]
model_leader = models.CharField("Model leader", max_length=128)
model_name = models.CharField(max_length=128, verbose_name="ModelName")
model_no = models.CharField(max_length=128, verbose_name="ModelNo")
os_name = models.ForeignKey(OSName, on_delete=models.CASCADE, verbose_name="OSName)
os_version = models.FloatField(choices=FLOAT_CHOICES)
chipset_type =
models.ForeignKey(ChipsetType,on_delete=models.CASCADE,verbose_name="chipsetType")
chipset_name =
models.ManyToManyField(Chipset)
class Meta:
verbose_name_plural = "ModelRegisteredList"
def __str__(self):
return self.model_name
2.create another model named ModelGSPRequest to raise a model gsp request which has model name,model no and os name ,model_gsp_requester,integrator ,region etc
class ModelGSPRequest(models.Model):
"""
This class is used to raise Model GSP request.
"""
registered_model = models.CharField("select model name", max_length=128)
registered_model_no = models.CharField("select model no", max_length=128)
registered_model_os_name = models.CharField("select os name",max_length=128)
registered_chipset_type = models.ForeignKey(ChipsetType, on_delete=models.CASCADE, verbose_name="chipsetType")
registered_chipset_name = models.ManyToManyField(Chipset)
model_gsp_requester = models.CharField("Model GSP Requester", max_length=128)
integrator = models.CharField("Integrator", max_length=100)
class Meta:
verbose_name_plural = "ModelGSPRequests"
def __str__(self):
return self.model_gsp_requester + self.integrator + str(self.pk)
|
ModelRegister |
|
|
|
|
ModelName |
ModelNo |
OSName |
chipset |
|
G1 |
G100 |
O |
qct |
|
G2 |
G110 |
O |
qct |
|
G5 |
H850 |
O |
qct |
|
G5 |
H860 |
O |
qct |
|
G5 |
H850 |
P |
qct |
|
G5 |
H860 |
P |
qct |
Lets assume this is the ModelRegister data stored in the database.
Now from ModelGSPRequest model, I need registered_model to populate with the unique values from model_name in ModelRegister .
Based on selection of model from registered_model , registered_model_no should populate with unique values of selected model.
For Example, If selected model from registered_model is G5 from the above table .registered_model_no should populate with values : H850, H860 and user can either or both of them while raising from ModelGSPRequest .
To accomplish this requirement, i have written an Ajax function named `load_model_details` which triggers when there is a change in the model name drop down selection. Through this method, i got all the model instances for the selected model & then i am passing it as a context to `model_info_options.html` to get the model number and OS Name details for the selected model.
Below is the code for forms.py
---------------------------------------
def unique_model_names():
return [("","---------------")]+list(ModelRegister.objects.values_list('model_name','model_name').order_by('model_name').distinct())
def unique_model_numbers():
return list(ModelRegister.objects.values_list('model_no','model_no').order_by('model_no').distinct())
def unique_os_names():
return list(ModelRegister.objects.values_list('os_name','os_name').order_by('os_name').distinct())
class ModelGSPRequestForm(ModelForm):
"""
This class is used to define the form fields to raise the model GSP request.
"""
registered_model = forms.ChoiceField(required=False, choices=unique_model_names,widget=forms.Select)
registered_model_no = forms.ChoiceField(required=False, widget=forms.SelectMultiple)
class Meta:
model = ModelGSPRequest
exclude = ['model_gsp_requester']
def clean(self):
registered_model = self.cleaned_data.get('registered_model')
registered_model_no = self.cleaned_data.get('registered_model_no')
print("clean Method :ModelGSPRequestForm:", registered_model)
print("clean Method :ModelGSPRequestFor:", registered_model_no)
def __init__(self, *args, **kwargs):
super(ModelGSPRequestForm, self).__init__(*args, **kwargs)
#self.form_tag = False
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset("Add Model GSP Request",
Row('registered_model','registered_model_no','registered_model_os_name',
'registered_chipset_type',registered_chipset_name','integrator',
)
)
)
self.fields['registered_model_no'].queryset = ModelNumber.objects.none()
ModelGSPRequestFormSet = modelformset_factory(ModelGSPRequest, form=ModelGSPRequestForm, extra=1, can_delete=True)
ajax.py:
---------
Below is the code snippet used get the model instances for the selected model
def load_model_details(request):
context = {}
modelname = request.GET.get("model")
context["modelnos_for_model"] = list(ModelRegister.objects.filter(model_name=modelname).values_list('model_no',
flat=True).order_by('model_no').distinct())
return HttpResponse(json.dumps(context),content_type="application/json")
views.py:--------- def create_model_gsp_request_form(request,id=None):
print("Inside create_model_gsp_request_form")
template_name = "ModelGSPRequest.html"
heading_message = "ModelGSPRequest"
if id:
action = 'edit'
model = get_object_or_404(ModelGSPRequest, pk=id)
else:
action = 'submit'
model = ModelGSPRequest()
message = ""
if request.method == 'GET':
print("Get request in create_model_gsp_request_form")
formset = ModelGSPRequestFormSet()
elif request.method == 'POST':
print("post request in create_model_gsp_request_form")
formset = ModelGSPRequestFormSet(request.POST,request.FILES)
if formset.is_valid():
for form in formset:
# only save if name is present
if form.cleaned_data.get('registered_model'):
new_form = form.save(commit=False)
new_form.model_gsp_requester = request.user.username
new_form.save()
formset.save_m2m()
#return redirect('ModelGSPRequestList')
return HttpResponseRedirect('/gspapp/ModelGSPRequestList')
return render(request, template_name, {
'formset': formset,
'heading': heading_message,
#'registered_model_data': registered_model_details,
'action':action
})
ModelGSPRequest.html:--------------------<!DOCTYPE html>
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block static %}
{% endblock static %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
<div class="container">
{{ formset.management_form }}
<table class="table">
{% for form in formset.forms %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tr class="{% cycle row1 row2 %} formset_row">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<button type="submit" class="btn btn-primary">
{% if action == "submit" %}
<span class="fas fa-plus"></span>Submit
{% else %}
<span class="fas fa-edit"></span>Update
{% endif %}
</button>
</div>
</form>
{% endblock content %}
{% block scripts %}
<script type="text/javascript">
$('.formset_row').formset({
addText: 'add model gsp request',
deleteText: 'remove',
prefix: 'modelgsp_set'
});
</script>
<script type="text/javascript">
$("#id_form-0-registered_model").change(function () {
var modelname = $(this).val(); // get the selected model from the HTML input
console.log(modelname);
$.ajax({ // initialize an AJAX request
url: "load_model_details", // set the url of the request (= localhost:8000/hr/ajax/load-cities/)
data: {
'model': modelname // add the modelname to the GET parameters
},
success: function (result) { // `data` is the return of the `load_model_details` view function
// empty the model no multiple select field
$("#id_form-0-registered_model_no").empty()
// $("#id_form-0-registered_model_no").html(data); // replace the contents of the city input with the data that came from the server
$.each(result.modelnos_for_model, function(index,value){
$("#id_form-0-registered_model_no").append('<option value="'+value+'">'+value+'</option>')
});
}
});
});
$("#id_form-0-registered_model_no").change(function () {
var modelnos = []; // get the selected modelno from the HTML input
$.each($("#id_form-0-registered_model_no option:selected"),function(){
modelnos.push($(this).val());
});
console.log("selected modelnumbers are:" + modelnos.join(","));
$.ajax({ // initialize an AJAX request
url: "load_os_details", // set the url of the request (= localhost:8000/hr/ajax/load-cities/)
data: {
'model_nos': modelnos // add the modelname to the GET parameters
},
success: function (data) { // `data` is the return of the `load_os_details` view function
$("#id_form-0-registered_model_os_name").html(data);
}
});
});
</script>
{% endblock scripts %}
Please find the screen shot for the scenario where I am getting the error.
Please advise how to proceed resolving the below error.
