1

Я строю небольшую форму, на которой я показываю некоторые данные в таблице, кроме того, у меня есть два dropdown, с помощью которых вы можете выбрать текущие данные или год для данных, которые вы хочу видеть в таблице.выставление данных с помощью формы django get request

Мой вопрос, как я могу заполнить dropdown с текущего месяца и года, используя django форма получения запроса, я немного запутался, как обработать это, на мой взгляд, обратите внимание, что я использую ОЦК 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 

ответ

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, и вы можете иногда видеть некоторые причудливые причуды.

Edit: Вы должны также обновить форму, чтобы использовать ChoiceField и установить значения по умолчанию с timezone.now().month и timezone.now().year.

Счастливое кодирование.

+0

Я хочу использовать библиотеку 'select2' в этом поле, вот почему я создаю' CharFields', я хочу избежать 'ChoiceField'. Я прав, или ошибаюсь, впервые используя' select2'. – PetarP

+0

Предполагая, что вы используете 'django-select2', [просто укажите виджет в форме] (https://django-select2.readthedocs.io/en/latest/django_select2.html#django_select2.forms.Select2Widget) (и затем следуйте всем остальным документам установки). – Anonymous

+0

нет Я использую стандартную библиотеку – PetarP