问题描述
我正在构建一个小型表格,在该表格上我将在表格中显示一些数据,此外还有两个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
1楼
当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().month
和timezone.now().year
设置默认值。
快乐的编码。