使用 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().month
和 timezone.now().year
设置默认值。
编码愉快。
我正在构建一个小表格,在 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().month
和 timezone.now().year
设置默认值。
编码愉快。