2014-09-11 55 views
0

我有一個包含5個窗體的Django 1.6窗體嚮導。我希望每個表單都可以訪問以前所有表單中的字段值。Django窗體嚮導:訪問窗體中的上下文

我已經在views.py中定義了一個get_context_data方法,它似乎做了它應該做的。這是我的views.py

from django.shortcuts import render 
from django.shortcuts import render_to_response 
from django.contrib.formtools.wizard.views import SessionWizardView 
from django.contrib.auth.decorators import login_required 
from django.http import HttpResponseRedirect 
import pdb 

class CalcWizard(SessionWizardView): 

    # Override template_name 
    template_name = 'calc/forms.html' 

    # Define a __name__ property on the wizard. 
    # We do this because a number of Django decorators 
    # raise an AttributeError when you use them to 
    # decorate an instance, complaining they cant find __name__ 
    @property 
    def __name__(self): 
     return self.__class__.__name__ 

    def get_context_data(self, form, **kwargs): 
     context = super(CalcWizard, self).get_context_data(form=form, **kwargs) 
     if self.steps.current >= 0: 
      data_0 = self.get_cleaned_data_for_step('0') # zero indexed 
      context.update({'data_0':data_0}) 
     if self.steps.current >= 1: 
      data_1 = self.get_cleaned_data_for_step('1') 
      context.update({'data_1':data_1}) 
     if self.steps.current >= 2: 
      data_2 = self.get_cleaned_data_for_step('2') 
      context.update({'data_2':data_2}) 
     return context 

    def done(self, form_list, **kwargs): 
     # This is not done yet 
     return render_to_response('calc/forms.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 

但是,我不明白如何訪問我的表單中的上下文數據。

這是我forms.py的一部分:我的urls.py的

class DeliveryForm(forms.Form): 

    costs = forms.DecimalField(\ 
     max_digits=16, \ 
     decimal_places=2, \ 
     label=_(u'Materialkostnad (kr)'), \ 
     localize=True, \ 
     validators=[MinValueValidator(0)]) 
    amount = forms.DecimalField(\ 
     max_digits=16, \ 
     decimal_places=2, \ 
     label=_(u'Mängd/Antal (kvm)'), \ 
     localize=True, \ 
     validators=[MinValueValidator(0)]) 
    CHOICES=[(0,'BLC inomhus'), (1,'BLC utomhus'), \ 
     (2,'BLC externt inomhus'), (3,'BLC externt utomhus')] 
    blc_inventory = forms.ChoiceField(\ 
     choices=CHOICES, \ 
     widget=forms.RadioSelect(), \ 
     label=_(u'Var vill du lagra ditt material?')) 
    ... 
    ... 
    ... 
    ... 

    def __init__(self, *args, **kwargs): 
     super(DeliveryForm, self).__init__(*args, **kwargs) 
     if kwargs ??? is not None: 
      form.costs=??? 

下面是部分

urlpatterns = patterns('', 

    url(r'^admin/filebrowser/', include(site.urls)), 
    url(r'^grappelli/', include('grappelli.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^calc/$', CalcWizard.as_view([\ 
     ConstructionForm,\ 
     DeliveryForm,\ 
     KitningForm,\ 
     CarryinginForm,\ 
     ResultForm] 
    )), 
) 

我如何訪問我的形式方面的數據?

回答

0

你的描述有點短,但我認爲你在視圖中get_context_data ,因爲你說它是按照它應該做的。

只有在具有上下文的視圖中對其進行實例化後,您的表單才能夠訪問此上下文。所以,你可以通過上下文的形式,如:

form = DeliveryForm(ctx=context) 

在您的形式__init__您可以檢查它是否有使用這樣的:使用的東西的

def __init__(self, *args, **kwargs): 
    super(DeliveryForm, self).__init__(*args, **kwargs) 
    ctx = kwargs.get('ctx', None) 
    if ctx is not None: 
     form.s_costs=ctx['costs'] 

在視圖中的情況下,喜歡嚮導,有一個get_form_kwargs您可以在其中爲表單設置正確的上下文。類似的東西:

def get_form_kwargs(self, step): 
    kwargs = {} 
    if step == 1: 
     kwargs['foo'] = 'bar' 
    return kwargs 

從表單中您現在可以訪問kwarg['foo']

+0

謝謝您的回覆。我已更新我的帖子以更具體。 – 2014-09-11 09:24:16

+0

哪裏,更確切地說,我應該添加實例,form = DeliveryForm(ctx = context),在我看來? – 2014-09-11 09:36:24

+0

抱歉,延遲。由於您使用的是嚮導,因此您可以使用嚮導中的get_form_kwargs將正確的上下文傳遞給您的表單。 [見文檔](https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form_kwargs)只需檢查步驟正確的值傳遞給表單。 – 2014-09-15 10:19:33