Django - ограничение ChoiceField в форме - PullRequest
1 голос
/ 12 мая 2010

Использование 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()
    ....

In 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'),

Итак, я занимаюсь созданием страницы, с помощью которой можно посмотреть детали конкретного сайта. Если в URL не указан идентификатор сайта, существует форма для его выбора, которая затем будет перенаправлена ​​на правильный URL-адрес (с помощью javascript в шаблоне).

Что я хочу сделать после выбора сайта, так это создать на странице форму, позволяющую выбирать объекты SiteMonth, принадлежащие этому сайту, для дальнейшего изучения. Мой код выше в настоящее время перечисляет все объекты SiteMonth для всех сайтов. Как настроить форму SiteMonth так, чтобы она заполнялась только значениями, относящимися к идентификатору сайта, указанному в запросе GET?

Я могу придумать пару способов сделать это, ни один из них не изящный - как правильно вести джанго?

1 Ответ

4 голосов
/ 12 мая 2010

Измените 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...