Вот как я это сделал. Он представляет базовый c метод для создания зависимого выпадающего списка с использованием Django и JQuery. В models.py я определил все варианты следующим образом.
GENDER_CHOICES = [
('Male', 'Male'),
('Female', 'Female'),
]
MALE_CATEGORIES = [
('Male Category 1', 'Male Category 1'),
('Male Category 2', 'Male Category 2'),
('Male Category 3', 'Male Category 3'),
]
FEMALE_CATEGORIES = [
('Female Category 1', 'Female Category 1'),
('Female Category 2', 'Female Category 2'),
('Female Category 3', 'Female Category 3'),
]
Определил метод (get_all_choices) для добавления и возврата всех вариантов (MALE_CATEGORIES и FEMALE_CATEGORIES) следующим образом. Сделайте вызов метода, чтобы назначить все варианты выбора переменной выбора поля категории MyModel.
def get_all_choices():
all_choices = MALE_CATEGORIES
all_choices+=FEMALE_CATEGORIES
return all_choices
class MyModel(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=get_all_choices())
В forms.py,
class MyModelForm(ModelForm):
class Meta:
model = MyModel
fields = [
'name',
'gender',
'category',
]
Отрисовать html через некоторое представление с формой в качестве контекста (в данном случае mymodelform). По моему html,
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<form class="form-class" action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in mymodelform %}
<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>