РЕДАКТИРОВАТЬ
Черт.Все это печаталось, потому что я пропустил одну часть кода;).Как упоминает @Alasdair в комментариях, вы исключили department
из формы, поэтому вы можете ограничить это с помощью Django.Я собираюсь оставить свой оригинальный ответ, однако, на всякий случай, если он может помочь кому-то еще.
Для ваших обстоятельств все, что вам нужно, это:
class MembershipForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MembershipForm, self).__init__(*args, **kwargs)
self.fields['project'].queryset = self.fields['project'].queryset.filter(department_id=self.instance.department_id)
И затем:
MembershipFormSet = modelformset_factory(Membership, form=MembershipForm, exclude=('department', 'employee'),)
Оригинальный ответ (для потомков)
Вы не можете ограничить это в Django, потому что значение для отдела изменчиво, и, таким образом, список проектов можетварьироваться в зависимости от того, какой именно отдел выбран в данный момент.Чтобы проверить форму, вам нужно будет передать все возможные проекты, которые могут быть разрешены для Django, поэтому единственный вариант - AJAX.
Создайте представление, которое будет возвращать ответ JSON, состоящий из проектов дляконкретный отдел подпитывается в поле зрения.Что-то вроде:
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import get_list_or_404
from django.utils import simplejson
def ajax_department_projects(request):
department_id = request.GET.get('department_id')
if department_id is None:
return HttpResponseBadRequest()
project_qs = Project.objects.select_related('department', 'project_type')
projects = get_list_or_404(project_qs, department__id=department_id)
data = []
for p in projects:
data.append({
'id': p.id,
'name': unicode(p),
})
return HttpResponse(simplejson.dumps(data), mimetype='application/json')
Затем создайте немного JavaScript, чтобы извлекать это представление при каждом изменении поля выбора отдела:
(function($){
$(document).ready(function(){
var $department = $('#id_department');
var $project = $('#id_project');
function updateProjectChoices(){
var selected = $department.val();
if (selected) {
$.getJSON('/path/to/ajax/view/', {department_id: selected}, function(data, jqXHR){
var options = [];
for (var i=0; i<data.length; i++) {
output = '<option value="'+data[i].id+'"';
if ($project.val() == data[i].id) {
output += ' selected="selected"';
}
output += '>'+data[i].name+'</option>';
options.push(output);
}
$project.html(options.join(''));
});
}
}
updateProjectChoices();
$project.change(updateProjectChoices);
});
})(django.jQuery);