当前位置: 代码迷 >> python >> 用Django形式获取数据获取请求
  详细解决方案

用Django形式获取数据获取请求

热度:81   发布时间:2023-06-14 08:47:49.0

我正在构建一个小型表格,在该表格上我将在表格中显示一些数据,此外还有两个dropdown ,您可以使用它们选择要在表格中查看的数据的当前数据或年份。

我的问题是,如何使用django form get请求使用当前月份和年份填充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

在我看来,我正在显示表格,其余的我要做。

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创建实际的表单对象时,它将获取参数以从传递给表单:

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时区设置,否则您可能偶尔会看到一些django.utils.timezone.now()

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

快乐的编码。