使用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方式?
答案 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)