当前位置: 首页 > 面试题库 >

Django管理员内联中的“国家/州/城市”下拉菜单

和魁
2023-03-14
问题内容

我有一个按BusinessBranch模型输入的城市外键。我的城市模型还具有州和县模型的州和国家外键。我很难在BusinessBranchInline中显示州和国家/地区下拉菜单。实现这一目标的最佳方法是什么?如果下拉列表根据其父项的值过滤项目,那就太好了。


问题答案:

有了一点黑客,这是相当可行的。

在以下示例中,使用County代替State和Municipality代替City。因此,模型如下:

class County(models.Model):
    name = models.CharField(_('Name'), max_length=100, unique=True)

class Municipality(models.Model):
    county = models.ForeignKey(County, verbose_name=_('County'))
    name = models.CharField(_('Name'), max_length=100)

class Location(models.Model):
    name = models.CharField(max_length=100)
    county = models.ForeignKey(County, verbose_name=_('County'))
    municipality = models.ForeignKey(Municipality,
            verbose_name=_("Municipality"))

问题有两个方面:客户端JavaScript和服务器端字段呈现。

客户端JavaScript(使用JQuery,假定从/site_media/js/municipality.js提供)如下:

var response_cache = {};

function fill_municipalities(county_id) {
  if (response_cache[county_id]) {
    $("#id_municipality").html(response_cache[county_id]);
  } else {
    $.getJSON("/municipalities_for_county/", {county_id: county_id},
      function(ret, textStatus) {
        var options = '<option value="" selected="selected">---------</option>';
        for (var i in ret) {
          options += '<option value="' + ret[i].id + '">'
            + ret[i].name + '</option>';
        }
        response_cache[county_id] = options;
        $("#id_municipality").html(options);
      });
  }
}

$(document).ready(function() {
  $("#id_county").change(function() { fill_municipalities($(this).val()); });
});

现在,您需要Ajax视图来服务属于给定县的市政当局(假定从/ municipalities_for_county /服务):

from django.http import JSONResponse
from django.utils.encoding import smart_unicode
from django.utils import simplejson

from myproject.places.models import Municipality

def municipalities_for_county(request):
    if request.is_ajax() and request.GET and 'county_id' in request.GET:
        objs = Municipality.objects.filter(county=request.GET['county_id'])
        return JSONResponse([{'id': o.id, 'name': smart_unicode(o)}
            for o in objs])
    else:
        return JSONResponse({'error': 'Not Ajax or no GET'})

最后,admin.py中用于呈现该字段的服务器端代码如下。一,进口:

from django import forms
from django.forms import widgets
from django.forms.util import flatatt
from django.utils.encoding import smart_unicode
from django.utils.safestring import mark_safe
from django.contrib import admin
from django.utils.translation import ugettext_lazy

from myproject.places.models import Municipality, Location

然后,小部件:

class MunicipalityChoiceWidget(widgets.Select):
    def render(self, name, value, attrs=None, choices=()):
        self.choices = [(u"", u"---------")]
        if value is None:
            # if no municipality has been previously selected,
            # render either an empty list or, if a county has
            # been selected, render its municipalities
            value = ''
            model_obj = self.form_instance.instance
            if model_obj and model_obj.county:
                for m in model_obj.county.municipality_set.all():
                    self.choices.append((m.id, smart_unicode(m)))
        else:
            # if a municipality X has been selected,
            # render only these municipalities, that belong
            # to X's county
            obj = Municipality.objects.get(id=value)
            for m in Municipality.objects.filter(county=obj.county):
                self.choices.append((m.id, smart_unicode(m)))

        # copy-paste from widgets.Select.render
        final_attrs = self.build_attrs(attrs, name=name)
        output = [u'<select%s>' % flatatt(final_attrs)]
        options = self.render_options(choices, [value])
        if options:
            output.append(options)
        output.append('</select>')
        return mark_safe(u'\n'.join(output))

接下来,形式:

class LocationForm(forms.ModelForm):
    municipality = forms.ModelChoiceField(Municipality.objects,
            widget=MunicipalityChoiceWidget(),
            label=ugettext_lazy("Municipality"), required=False)

    class Meta:
        model = Location

    def __init__(self, *args, **kwargs):
        """
        We need access to the county field in the municipality widget, so we
        have to associate the form instance with the widget.
        """
        super(LocationForm, self).__init__(*args, **kwargs)
        self.fields['municipality'].widget.form_instance = self

最后是admin类:

class LocationAdmin(admin.ModelAdmin):
    form = LocationForm
    class Media:
        js = ('http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js',
                '/site_media/js/municipality.js')

admin.site.register(Location, LocationAdmin)

让我知道是否还有不清楚的地方。



 类似资料:
  • 问题内容: 我有一个php页面,我想从国家,州和城市列表中选择一个位置。该页面包含用于用户注册的其他数据(名称,电子邮件等),因此在选择框刷新时,我不想刷新页面或其他任何内容。当前,每个选择框仅加载国家,州或城市的完整列表。我希望将它们链接起来,所以我没有重复的城市名称(不同州或国家/地区的名称相同)。 位置存储在数据库中,并在加载时传递到页面。然后将它们循环并添加到选择框中: 数据库结构非常简单

  • 问题内容: 好吧,我的设计很简单。 是否有一种简单的方法允许用户在一页上全部创建更新? 我想要的是用户能够转到管理界面,添加新的更新,然后在编辑更新时添加一个或多个帖子,每个帖子都有一个或多个Media项目。另外,我希望用户能够在更新内重新排列帖子。 我当前的尝试在admin.py中包含以下内容: 这使用户可以添加一个新的Post项,选择相关的Update,向其添加Media项,然后单击Save-

  • 与为共享同一位置的多个用户输入重复的用户位置不同,我计划通过将Locations表中的locationID提供给user表中的每个用户来进行规范化,这样我就不必在user表中重复输入Country、State和City了,这样我就节省了磁盘空间。(美国,CT,Woodhaven) 在几个用户说“12”之后,用户可以输入“USA”、“NY”、“Albany”,并将此条目输入到“Locations”表

  • 我有一个表格,上面有国家、州、城市、城市的纬度/经度。我试图构建一个json字符串,如下所示。 数据库查询结果在一个数组中:JSONData。我有国家的代码。不确定如何添加一个州如果它不存在和一个城市如果它不存在与城市的纬度和经度(我有的部分???)

  • 本文向大家介绍JavaScript省市级联下拉菜单实例,包括了JavaScript省市级联下拉菜单实例的使用技巧和注意事项,需要的朋友参考一下 最近学了一个关于省市级联简单的小例子,贴出来与大家分享一下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • Quickie对象状态简介 了解实例在会话中的状态是很有帮助的: 瞬变 -不在会话中且未保存到数据库中的实例;即没有数据库标识。这类对象与ORM的唯一关系是它的类有一个 Mapper 与之相关的。 悬而未决的 当你 Session.add() 一个暂时的实例,它将变为挂起。它实际上还没有被刷新到数据库中,但是下一次刷新发生时会被刷新。 持久的 -存在于会话中且在数据库中有记录的实例。通过刷新使挂起