【问题标题】:Django Select Drop Down menu FlowDjango 选择下拉菜单流程
【发布时间】:2014-11-24 13:03:10
【问题描述】:

我正在尝试使用 Select 小部件进行 2 层搜索,其中包含下拉菜单,结果将是我的 Meta.model 中的字段列表。第一层是来自 State.model 的州列表。选择后,它应该列出所选州的所有城市,我遇到的问题(我认为这是由于我缺乏知识)是城市列表没有被过滤,而是所有的列表无论州如何,我的数据库中的城市。我不确定在哪里或如何传递我的变量以便能够调用我的 .filter() 语句。

models.py

 class Meta(models.Model):
     rcabbr             = models.CharField(max_length = 15)
     slug               = models.SlugField(unique=False)
     state              = models.ForeignKey('State')
     rc_state           = models.CharField(max_length = 3)
     oerp               = models.CharField(max_length=18)
     subgrp             = models.SlugField()
     sonus_pic          = models.CharField(max_length=8)
     ems                    = models.CharField(max_length=14)
     agc                    = models.CharField(max_length=14)

     def __unicode__(self):
         return self.rcabbr

 class State(models.Model):
     name               = models.CharField(max_length=2)
     slug               = models.SlugField(unique=True)
     state_long         = models.CharField(max_length=15)
     owning_site            = models.CharField(max_length=12)

     def __unicode__(self):
         return self.name
         return self.state_long

forms.py

class states(forms.Form):
     invent = [(k.name,k.state_long) for k in State.objects.all()]
     rclist = forms.ChoiceField(widget=forms.Select, choices=invent)


class rateCenter(forms.Form):
     invention = [(k.id,k.rcabbr,k.rc_state) for k in Meta.objects.all()]
     rcviews = forms.ChoiceField(widget=forms.Select, choices=invention)

views.py

 def StateAll(request):
     """ This lists out all of the states within the database that
         are served"""
     rclist = states()
     return render(request, 'statelist.html',{'rclist': rclist})


 def RcView(request):
     """ this should list all the rateCenters within 
            the state that was selected in StateAll() """
     rclist = request.GET['rclist'] 
     forms = rateCenter()
     return render(request, 'rclist.html',{'forms': forms})

逻辑告诉我应该在 forms.py 中执行我的 .filter() 语句,但不确定如何在 StateAll() 视图中传递 request.GET 的结果。我确实安装了 debug_toolbar,所以我可以看到变量 u'rclist' 和值 u'LA'(我的测试状态)。我使用超链接实现了 100% 的工作,但是与生产版本中的内容相比,我的测试数据库的大小是微不足道的,而且 HREF 是不可能的。

我的理解是:

 ChainedForeignKey(LinkedModel, LinkedModel.field = "field in first Tier", chained_model_field = "current model_field")

这么简单的模型我应该是这样的吗?

 def State(model.models):
      name = models.CharField(max_length=20) #this is the state abbreviation
      state_long = models.CharFeild(max_length=20)#this is state long form

 def Meta(model.models):
      state = models.CharField(max_length=20)
      slug = models.SlugField(unique = False) #same values as rcabbr
      rcabbr =  ChainedForeignKey(State, chained_field = "state_long", 
           chained_model_field = "slug")
      .....

看起来对吗........所以下拉列表中的第一个字段应该是 State_long,一旦选择下一个应该是 slug?在那个时候,蛞蝓应该被传递给我的网址和最后一页的视图。

我将尝试这个,但是我不能 100% 确定如何查看我的视图,以及我是否需要对表单页面做一些事情,或者这是否涵盖了它?该文档对于新手来说不是用户友好的,因此非常感谢任何输入!

【问题讨论】:

  • 试试这个,它很漂亮而且超级简单。自动创建 JavaScript/AJAX 以完全按照您的要求进行操作(请参阅 ChainedForeignKey)
  • [Django-smart-selects](github.com/digi604/django-smart-selects)
  • 刚刚安装它,现在阅读如何实现。谢谢。我会回复你的结果。欣赏!!!
  • 我已经用过很多次了,如果你遇到麻烦,很高兴明天发布一个如何为你的模型创建字段的例子
  • 那太好了,我今晚玩一下,明天发布我的进度!!

标签: django django-forms django-views


【解决方案1】:

我想到了许多第三方库 django-smart-selectsdajax - 它们会为您自动执行此操作,并为您提供必要的 JavaScript 来动态过滤表单字段。

如果您正在调查这些,以下是仅使用 django 表单的方法:

class RateCenterForm(forms.Form):
    rate_center = forms.ModelChoiceField(queryset=Meta.objects.all())

    def __init__(self, *args, **kwargs):
       state = kwargs.pop('state')
       super(RaterCenterForm, self).__init__(*args, **kwargs)
       self.fields['rate_center'].queryset = Meta.objects.filter(state=state)

ModelChoiceField 是一个选择下拉菜单,它从模型中获取其值。

现在在您看来,您可以这样称呼它:

def show_rate_centers(request):
    form = RateCenterForm(state='SomeState')
    # .. your normal logic here

【讨论】:

  • 越来越近我看过但不理解 def init 部分。现在我收到一个错误,之前我没有遇到过“'字段列表'中的未知列'meta_meta.rcabbr_id'”不确定它来自哪里,因为我没有在任何地方定义它。
  • 由于您传递的参数state 通常不会传递给表单,因此您需要重写__init__ 方法来删​​除这个额外的参数(documentation 有更多关于这个)至于你的第二部分 - 这可能与ChainedForeignKey有关。
  • 非常感谢!我将不得不对外键进行更多研究。我将 db 修改为 rcabbr_id,然后我收到一个错误,即 id 字段无效,因此某处有些混淆。我会做更多的研究谢谢你的意见。非常感谢!
  • 你不想同时使用 ChainedForeignKey 和我发布的内容,使用其中一个 - 使用两者会进一步产生问题。
  • 我不确定你从哪里得到“SomeState”。我在 response.GET 语句中传递了变量 rclist ,所以我假设我的语句应该是 form = RateCenterForm(state='rclist') ,我仍然会得到意想不到的 kwarg
猜你喜欢
  • 2022-01-20
  • 2020-10-16
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多