代码之家  ›  专栏  ›  技术社区  ›  meepmeep

Django-限制Choicefield的形式

  •  1
  • meepmeep  · 技术社区  · 16 年前

    使用Django 1.1.1

    在模型中

    class Site(models.Model):
        name = models.CharField(max_length=50)
    
    class SiteMonth(models.Model):
        site = models.ForeignKey(Site)
        timestamp = models.DateTimeField()
        parameter1 = models.IntegerField()
        ....
    

    现场查看:

    #form for selecting which site to analyse
    class SiteForm(forms.Form):
        site = forms.ModelChoiceField(queryset=Site.objects.all())
    
    #form for selecting which site month to analyse
    class SiteMonthForm(forms.Form):
        month = forms.ModelChoiceField(queryset=SiteMonth.objects.all())
    
    def site(request,site=None):
        siteForm = SiteForm(request.GET)
        if not site==None:
            siteMonthForm = SiteMonthForm(request.GET)
            .....
    

    在Urs.Py:

    (r'^site/$', 'my_project.site_view.site'),
    (r'^site/(?P<site>\d+)/', 'my_project.site_view.site'),
    

    所以我要做的是制作一个页面,可以用来查看特定站点的详细信息。如果URL中没有提供站点ID,则存在一个表单来选择一个,然后该表单将重定向到正确的URL(通过模板中的javascript)。

    一旦选择了一个站点,我想做的就是在页面中有一个表单,允许选择属于该站点的SiteMonth对象,以便进一步调查。当前列表上方的我的代码 全部的 所有站点的SiteMonth对象。如何将sitemonth表单设置为只填充与get请求中给定的站点ID相关的值?

    我可以想出一些方法来做到这一点,既不特别优雅-什么是正确的德扬戈方式?

    1 回复  |  直到 16 年前
        1
  •  4
  •   KillianDS    16 年前

    将SiteMonthForm更改为如下所示:

    class SiteMonthForm(forms.Form):
        month = forms.ModelChoiceField(queryset=SiteMonth.objects.all())
        def __init__(self, site, *args, **kwargs):
            super(SiteMonthForm, self).__init__(*args, **kwargs)
            self.fields["month"].queryset = SiteMonth.objects.filter(site__id=site)
    

    像这样使用:

    def site(request,site=None):
        siteForm = SiteForm(request.GET)
        if not site==None:
            siteMonthForm = SiteMonthForm(site, request.GET)