Error while submitting the form :“Select a valid choice. ['G712'] is not one of the available choices.”

1,031 views
Skip to first unread message

Dilipkumar Noone

unread,
Mar 14, 2020, 4:19:06 PM3/14/20
to Django users

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=Falsewidget=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=Falsewidget=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.
 

 

registered_model.gif

Reply all
Reply to author
Forward
0 new messages