使用 Django 表单获取请求公开数据

exposing data with django form get request

我正在构建一个小表格,在 table 中显示一些数据,此外我还有两个 dropdown,您可以使用它们 select 当前您要在 table.

中查看的数据的数据或年份

我的问题是如何使用 django 表单获取请求用当前月份和年份填充 dropdown,在我看来我不太清楚如何处理这个问题,请注意我'米使用 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

在我看来,我正在显示 table,我需要做剩下的事情。

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

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 时区设置,否则你可能偶尔会看到一些 off-by-one 怪癖。

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

编码愉快。