Вы можете сделать это после , модель будет сохранена, и с ней будет использоваться instalation
(хотя поиск будет instalation=self.instance.instalation
).
Однако,это не очень хорошо для вас, потому что, если выбран другой instalation
, список все равно останется для старого выбора, и, очевидно, вы не получите никакой помощи при первом создании объекта.
Какрезультат, единственный способ сделать это с AJAX.Вы создаете представление для получения выбранного instalation
id и возвращаете ответ JSON, состоящий из machines
, связанного с ним.Свяжите представление с вашим urlconf, а затем нажмите на него AJAX и обновите поле выбора на основе результатов.
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404
from django.utils import simplejson
def ajax_admin_get_machines_for_instalation(request):
instalation_id = request.GET.get('instalation_id')
if instalation_id is None:
# instalation_id wasn't provided so return all machines
machines_qs = Machine.objects.all()
else:
instalation = get_object_or_404(Instalation, pk=instalation_id)
machines_qs = Machine.objects.filter(instalation=instalation)
# 'name' is the field you want to use for the display value
machines = machines_qs.values('pk', 'name')
return HttpResponse(simplejson.dumps(machines), mimetype='application/json')
Затем JS:
(function($){
$(document).ready(function(){
function update_machine_options(){
var selected = $('#id_instalation').val();
if (selected) {
$.getJSON('/url/for/ajax/view/', {
instalation_id: selected
}, function(data, jqXHR){
var options = [];
for (k in data) {
options.append('<option value="'+data[k].pk+'">'+data[k].name+'</option>');
}
$('#id_machine').html(options.join(''));
});
}
}
update_machine_options();
$('#id_instalation').change(function(){
update_machine_options();
});
});
})(django.jQuery);