Вы захотите сделать эти настоящие модели, чтобы у вас было что-то вроде этого:
class ProgrammingCategory(models.Model):
name = models.CharField(max_length=200)
class ProgrammingLanguage(models.Model):
category = models.ForeignKey(ProgrammingCategory, related_name='languages')
name = models.CharField(max_length=300)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
planguages = models.ManyToManyField(ProgrammingLanguage)
Мало того, что это лучше с точки зрения удобства обслуживания (языки программирования меняются: появляются новые, вымирают старые), но это также дает вам гораздо большую гибкость в запросах.
Затем вы просто добавляете поле к вашему ModelForm
для категорий:
class UserProfileForm(forms.ModelForm):
...
category = forms.ModelChoiceField(queryset=ProgrammingCategory.objects.all(), required=False)
И в вашей форме вы получите выбор с полным списком категорий, а другой - с полным списком языков. Затем все, что вам нужно, это AJAX, чтобы выполнить фильтрацию за вас:
views.py
from django.core import serializers
from django.http import HttpResponse, HttpResponseBadRequest
def ajax_get_languages_for_category(request):
cat_id = request.GET.get('cat_id')
if cat_id is not None:
category = get_object_or_404(ProgrammingCategory, id=cat_id)
data = serializers.serialize('json', category.languages.all())
return HttpResponse(data, mimetype='application/json')
else:
return HttpResponseBadRequest()
script.js
$(document).ready(function(){
var $category = $('#id_category');
function updateLanguageChoices() {
var selected = $category.val();
if (selected) {
$.getJSON('/path/to/ajax/view/', { cat_id: selected }, function (data, jqXHR) {
var output = [];
$.each(data, function(i, item){
output.append('<option value="'+item.id+'">'+item.name+'</option>');
});
$('#id_planguage').html(output.join(''));
});
}
}
updateLanguageChoices();
$category.change(updateLanguageChoices);
});