如何在django-admin中根据另一个外键过滤外键字段?

1 投票
1 回答
527 浏览
提问于 2025-04-16 01:05

我有以下模型

class Region(models.Model):
    nombre = models.CharField(max_length=25)

class Departamento(models.Model):
    nombre = models.CharField(max_length=25)
    region = models.ForeignKey(Region)

class Municipio(models.Model):
    nombre = models.CharField(max_length=35)
    departamento = models.ForeignKey(Departamento)

我需要根据选择的地区来过滤部门的选项,并根据选择的部门来过滤市的选项。

这样做可以吗??

谢谢大家!

1 个回答

2

假设你是在说如何在一系列下拉框中实现这个功能:

首先,创建两个视图,一个是根据某个地区返回该地区的“部门”(Departamentos),另一个是根据某个部门返回该部门的“市”(Municipios)。

# views.py
from django.core import serializers

def departamentos_por_region(request, region_id):
    region = get_object_or_404(Region, id=region_id)
    departamentos = Departamento.objects.filter(region=region)
    return render_to_reponse("format_as_option_list.html",
                             {'departamentos': departamentos})

def municipios_por_departamento(request, departamento_id):
    # basically the same as above

我假设你是在初始页面中填充地区的下拉框,所以这里不需要特别的视图。

模板应该把部门格式化成一个HTML选项列表。

假设初始页面的HTML大概是这样的:

<select id='regions'>
  <option value='1'>Region 1</option>
  <option value='2'>Region 2</option>
</select>
<select id='departamentos'>
</select>
<select id='municipios'>
</select>

你可以使用一些JavaScript代码,比如用jQuery:

// this isn't tested code and likely contains an error or two
$('#regions').change(function(){

    // Region has changed, so reset Departamentos and Municipios
    $('#departamentos').html("")
    $('#municipios').html("")

    // now update the departamentos
    $.get('/ajax/departamentos_por_region/' +  $('#regions').val(),
          function(data) {
              ('#departamentos').html(data)    
          };     
    );
});

对市的处理方式和部门是一样的。

你可能还想做一些事情,比如当没有可选项时禁用某些字段,以及处理没有返回部门或市的情况。

撰写回答