用django表格获取请求暴露数据

时间:2017-02-16 07:14:04

标签: python django django-forms django-class-based-views formview

我正在构建一个小表单,我在表格中显示了一些数据,除此之外我还有两个dropdown,您可以使用它来选择数据的当前数据或年份你想在表格中看到。

我的问题是如何使用dropdown表单获取请求填充django当前月份和年份,我有点困惑如何在我的视图中处理此问题,请注意我&# 39; m使用CBV FormView

我尝试过这样的事情 form.py

from django import forms

import datetime


class StatisticsForm(forms.Form):
    """TODO: Simple form with two field, one for year
    other for month, so user can list Statistics for
    current month and year.
    :returns: TODO"""
    invoice_month = forms.CharField(label="month", max_length=225)
    invoice_year = forms.CharField(label="year", max_length=225)

    def get_initial(self):
        initial = super(StatisticsForm, self).get_initial()
        initial["invoice_month"] = datetime.date.today()
        initial["invoice_year"] = datetime.date.today()
        return initial

在我看来,我正在展示桌子,我需要做其余的工作。

view.py

from django.views.generic.edit import FormView

from .models import Rate
from statistics.forms import StatisticsForm
from statistics.services import StatisticsCalculation


class StatisticsView(FormView):
    """
    TODO: We need to handle
        Total Invoice - no matter how old, basically all of them
        Current month Total Invoice
    """
    template_name = "statistics/invoice_statistics.html"
    form_class = StatisticsForm

    def get_context_data(self, **kwargs):
        context = super(StatisticsView, self).get_context_data(**kwargs)

        def_currency = Rate.EUR

        context["can_view"] = self.request.user.is_superuser
        context["currency"] = def_currency
        context["supplier_statistic"] = StatisticsCalculation.statistic_calculation(default_currency)
        return context

1 个答案:

答案 0 :(得分:2)

FormView创建实际的表单对象时,它会从get_form_kwargs()获取传递给表单的参数:

def get_form_kwargs(self):
    """
    Returns the keyword arguments for instantiating the form.
    """
    kwargs = {
        'initial': self.get_initial(),
        'prefix': self.get_prefix(),
    }
    if self.request.method in ('POST', 'PUT'):
        kwargs.update({
            'data': self.request.POST,
            'files': self.request.FILES,
        })
 return kwargs

注意它是如何调用get_initial()本身(视图)而不是表单。它无法在表单上调用它,因为它尚未初始化。将您的方法移动到视图中,您就可以开始了。

作为旁注,使用django.utils.timezone.now()而不是stdlib datetime.date.today(),因为它尊重你的django时区设置,否则你偶尔会看到一些一对一的怪癖。

修改:您还应该更新表单以使用ChoiceField,并使用timezone.now().monthtimezone.now().year设置默认值。

快乐的编码。