0

我有一个包含 5 个表单的 Django 1.6 表单向导。我希望每个表单都可以访问所有以前表单中的字段值。

我在 views.py 中定义了一个 get_context_data 方法,它似乎做了它应该做的事情。这是我的意见.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]
    )),
)

如何访问表单中的上下文数据?

4

1 回答 1

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'].

于 2014-09-11T08:47:15.290 回答