Django - 限制表单中的ChoiceField

时间:2010-05-12 09:47:48

标签: django forms

使用Django 1.1.1

在models.py中:

class Site(models.Model):
    name = models.CharField(max_length=50)

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

在site_view.py中:

#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)
        .....

在urls.py中:

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

所以我正在做的是制作一个可用于查看特定网站详细信息的页面。如果网址中没有给出网站ID,则会选择一个表单,然后将其重定向到正确的网址(通过模板中的javascript)。

一旦选择了网站,我想要做的就是在页面中有一个表单,允许选择属于该网站的SiteMonth对象进行进一步调查。我上面的代码目前列出了所有网站的所有 SiteMonth对象。如何将SiteMonth表单设置为仅填充与GET请求中给出的站点ID相关的值?

我可以想到几种方法来做到这一点,既不是特别优雅 - 什么是正确的django方式?

1 个答案:

答案 0 :(得分:4)

将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)