首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Modelform和jquery在django中获得相互依赖的下拉列表?

如何使用Modelform和jquery在django中获得相互依赖的下拉列表?
EN

Stack Overflow用户
提问于 2013-01-02 19:20:22
回答 2查看 15.3K关注 0票数 16

我是django和jquery的新手。我正在开发一个基于django的应用程序,其中我在一个表单中有3个下拉列表。1.校园2.学校3.中心

等级制度是校园有学校,学校有中心。我想将这些下拉列表链接起来。

例如,我有3个校区,分别是Campus1,Campus2,Campus3。如果我选择Campus1,我应该只能在campus1中选择学校,如果我选择School1,那么我需要能够选择School1的中心,所有其他选项都应该隐藏。

我在网上搜索并尝试了这个http://blog.devinterface.com/2011/02/how-to-implement-two-dropdowns-dependent-on-each-other-using-django-and-jquery/,但它似乎对我不起作用。我也检查过这个http://www.javascriptkit.com/script/script2/triplecombo.shtml,但是因为我使用ModelForm来创建表单,所以这不符合我的需要。

请指导我这样做。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-01-02 20:28:07

您可能需要使用以下技术:

  • 自定义Django表单字段(在模型表单中)
  • ajax(要获取records)
  • simplejson(to,向Django发送json响应,更新客户端上的组合框)

让我们来看一个例子(没有真正测试过,只是在我的脑海中):

Models.py

代码语言:javascript
复制
from django.db import models

class Campus(models.Model):
    name = models.CharField(max_length=100, choices=choices.CAMPUSES)

    def __unicode__(self):
        return u'%s' % self.name

class School(models.Model):
    name = models.CharField(max_length=100)
    campus = models.ForeignKey(Campus)

    def __unicode__(self):
        return u'%s' % self.name

class Centre(models.Model):
    name = models.CharField(max_length=100)
    school = models.ForeignKey(School)

    def __unicode__(self):
        return u'%s' % self.name

Forms.py

代码语言:javascript
复制
import models
from django import forms

class CenterForm(forms.ModelForm):
    campus = forms.ModelChoiceField(queryset=models.Campus.objects.all())
    school = forms.ModelChoiceField(queryset=models.School.objects.none()) # Need to populate this using jquery
    centre = forms.ModelChoiceField(queryset=models.Centre.objects.none()) # Need to populate this using jquery

    class Meta:
        model = models.Center

        fields = ('campus', 'school', 'centre')

现在,在视图中编写一个方法,为校园下的学校和学校下的中心返回一个json对象:

Views.py

代码语言:javascript
复制
import models
import simplejson
from django.http import HttpResponse

def get_schools(request, campus_id):
    campus = models.Campus.objects.get(pk=campus_id)
    schools = models.School.objects.filter(campus=campus)
    school_dict = {}
    for school in schools:
        school_dict[school.id] = school.name
    return HttpResponse(simplejson.dumps(school_dict), mimetype="application/json")

def get_centres(request, school_id):
    school = models.School.objects.get(pk=school_id)
    centres = models.Centre.objects.filter(school=school)
    centre_dict = {}
    for centre in centres:
        centre_dict[centre.id] = centre.name
    return HttpResponse(simplejson.dumps(centre_dict), mimetype="application/json")

现在编写一个ajax/jquery方法来获取数据并填充HTML中的select元素。

AJAX/jQuery

代码语言:javascript
复制
$(document).ready(function(){
    $('select[name=campus]').change(function(){
        campus_id = $(this).val();
        request_url = '/get_schools/' + campus_id + '/';
        $.ajax({
            url: request_url,
            success: function(data){
                $.each(data, function(index, text){
                    $('select[name=school]').append(
                         $('<option></option>').val(index).html(text)
                     );
                });
            }
        });
        return false;
    })
});
票数 29
EN

Stack Overflow用户

发布于 2013-10-21 22:54:16

我不会重新发明轮子,而是使用Django Smart SelectsDjango Autocomplete Light

我也没有尝试过,但我即将在即将到来的项目中使用它们中的一个或两个。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14121132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档