У меня есть Model и ModelForm. ModelForm имеет зависимый раскрывающийся список, реализованный с помощью JQuery. Раскрывающийся список категорий изменяется соответственно каждый раз, когда выбирается выбор из раскрывающегося списка полов (Готово с JQuery). Всякий раз, когда я пытаюсь сохранить ModelForm в своих представлениях, я получаю сообщение о том, что выбранный мной выбор недействителен. Связано ли это с вариантами / опциями, добавляемыми в раскрывающийся список категорий после выбора из раскрывающегося списка полов? Вызывает ли это какой-либо конфликт с пустым кортежем поля категории по умолчанию? Ошибки возникают в поле категории.
В models.py,
GENDER_CHOICES = [
('Male', 'Male'),
('Female', 'Female'),
]
class Person(models.Model):
name = models.CharField(max_length=50, unique=True)
gender = models.CharField(max_length=7, choices=GENDER_CHOICES)
category = models.CharField(max_length=20, choices=[('', ''), ])
В forms.py,
class PersonForm(ModelForm):
class Meta:
model = Person
fields = [
'name',
'gender',
'category',
]
В views.py,
def personform_page(request):
context = {}
if request.method == 'POST':
personform = PersonForm(request.POST)
if personform.is_valid():
personform.save()
return redirect('personform_page')
context['personform'] = personform
else:
personform = PersonForm()
context['personform'] = personform
context['male_categories'] = MALE_CATEGORIES
context['female_categories'] = FEMALE_CATEGORIES
return render(request, 'app1/personform_page.html', context=context)
В app1 / personform_page. html,
<form class="form-class" action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in personform %}
<p>
{{ field.label_tag }}
{{ field }}
{% if field.help_text %}
<small style="color: black;"> {{ field.help_text }} </small>
{% endif %}
{% for error in field.errors %}
<p style="color: red;"> {{ error }} </p>
{% endfor %}
</p>
{% endfor %}
<button class="btn btn-outline-primary" type="submit">Join</button>
</form>
<script>
$(document).ready( function() {
$("#id_category").hide();
$("#id_gender").on('change', function(){
var gender = $("#id_gender").val();
if(gender == 'Male'){
$('#id_category').empty();
$("#id_category").show();
var maleCategories = ['Male Category 1', 'Male Category 2', 'Male Category 3'];
var length = maleCategories.length;
var i;
for(i=0; i < length; i++){
maleCategory = maleCategories[i];
$('#id_category').append(
`
<option value="${maleCategory}">
${maleCategory}
</option>
`
);
}
}
else if(gender == 'Female'){
$('#id_category').empty();
$("#id_category").show();
var femaleCategories = ['Female Category 1', 'Female Category 2', 'Female Category 3'];
var length = femaleCategories.length;
var i;
for(i=0; i < length; i++){
femaleCategory = femaleCategories[i];
$('#id_category').append(
`
<option value="${femaleCategory}">
${femaleCategory}
</option>
`
);
}
}
else{
$('#id_category').empty();
}
});
});
</script>