Django选择下拉菜单流程

时间:2014-09-30 02:14:59

标签: django django-forms django-views

我想要做的是使用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?那时slug应该传递到我的网址和最后一页的视图。

我会尝试这个但是我不是100%确定如何查看我的观点,如果我需要对表单页面做一些事情或者这是否涵盖了它?对于刚接触到此内容的人来说,该文档不是用户友好的,因此任何输入都将非常受欢迎!

1 个答案:

答案 0 :(得分:0)

有许多第三方图书馆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
相关问题