2014-09-11 5 views
0

У меня есть Django 1.6 form wizard, который содержит 5 форм. Я хочу, чтобы каждая из форм имела доступ к значениям полей во всех предыдущих формах.Django Form Wizard: доступ к контексту в формах

Я определил метод get_context_data в views.py и, похоже, делает то, что должен. Вот мои 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:

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=??? 

Здесь вы часть моего urls.py

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

Благодарим вас за ответ. Я обновил свой пост, чтобы быть более конкретным. –

+0

Где, точнее, я должен добавить экземпляр, form = DeliveryForm (ctx = context), на мой взгляд? –

+0

Извините за задержку. Поскольку вы используете мастер, вы можете использовать get_form_kwargs из мастера, чтобы передать правильный контекст в вашу форму. [См. Документы] (https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form_kwargs). Просто проверьте шаг правильное значение для перехода к форме. –