Tengo un proyecto de clave externa por modelo de fase. Estoy teniendo dificultades para crear una lista desplegable dependiente dentro de mi página de administración de Django.
Quiero que cuando el usuario seleccione un proyecto de la fase (desplegable del proyecto) de ese proyecto se muestre en el segundo menú desplegable
¿Cuál sería la mejor manera de lograr esto?
Sería genial si los menús desplegables filtraran los elementos según el valor de su padre.
class Project(models.Model): name = models.CharFieldmax_length = 100, unique= True) short_name = models.CharField(max_length= 4, unique= True) slug = models.SlugField(max_length= 100, allow_unicode=True, null=True, editable= False) location = models.OneToOneField(Location, on_delete = models.SET_NULL, null= True, blank= False, verbose_name= 'موقعیت') start_date = models.DateField(default= timezone.now, null= True, blank= True) end_date = models.DateField(default= timezone.now, null= True, blank= True) duration = models.IntegerField(default= 0, editable= False) class Phase(models.Model): title = models.CharField(max_length= 20) class ProjectPhase(models.Model): project = models.ForeignKey(Project, on_delete= models.CASCADE, related_name= 'phase') phase = models.ForeignKey(Phase, on_delete=models.CASCADE, related_name= 'project') start_date = models.DateField(default= timezone.now) end_date = models.DateField(default= timezone.now) duration = models.IntegerField(default= 0, editable= True)
class YourModelAdmin(admin.ModelAdmin): form = YourModelForm #list_display = ['your fields',] class Media: js = ("yourapp/selectajax.js",) admin.site.register(YourModel, YourModelAdmin)
jQuery(function($){ $(document).ready(function(){ $("#id_project_select").change(function(){ // console.log(obj.currentTarget.value); $.ajax({ url:"/get_phases/", type:"POST", data:{project: $(this).val(),}, success: function(result) { console.log(result); cols = document.getElementById("id_phase_select"); cols.options.length = 0; for(var k in result){ cols.options.add(new Option(k, result[k])); } }, error: function(e){ console.error(JSON.stringify(e)); }, }); }); }); });
@login_required def get_phases(request): project = request.POST.get('project') phases = {} try: if project: prophases = Project.objects.get(pk=int(project)).phase phases = {pp.phase.title:pp.pk for pp in prophases} except: pass return JsonResponse(data=phases, safe=False)