Django 表单 - 对不同的选择使用不同的预定义日期范围

til*_*bra 5 html javascript forms django django-forms

我有一个 Django 表单,用户可以在选择字段中选择变量,在选择日期小部件中选择开始日期和结束日期。对于不同的变量,可能的开始和结束日期有所不同。该表格有效,但所有变量仅适用于一个预定义的日期范围。如何根据变量更改可能的开始和结束日期?

\n
from django import forms\nfrom datetime import datetime \n\nParameter_CHOICES = [\n    ('', 'W\xc3\xa4hle ein Umweltvariable'),\n    ('niederschlag', 'Niederschlag [L/m\xc2\xb2]'),\n    ('bodentemperatur_5cm', 'Bodentemperatur in 5cm Tiefe [\xc2\xb0C]')\n]\n\nclass DataForm(forms.Form):\n    parameter = forms.ChoiceField(\n        widget=forms.Select,\n        choices=Parameter_CHOICES)\n    start_date = forms.DateField(label='Beginn:', widget=forms.SelectDateWidget(years=list(range(2007,2023))))\n    end_date = forms.DateField(label='Ende:', initial=datetime.now, widget=forms.SelectDateWidget(years=list(range(2007,2023))))\n
Run Code Online (Sandbox Code Playgroud)\n

我需要的是将niederschlag 的
\n \n和 bodentemperatur_5cm 设置为\nyears=list(range(2007,2023))

years=list(range(1991,2023))

\n

是否可以在 forms.py 中执行此操作,还是必须在 javascript/html 中执行此操作?

\n

更新\n我尝试用 jQuery 解决它,但我卡住了。\n我尝试使用此函数根据参数更改 Years Range choicec:

\n
$("#id_parameter").on('change', function(){\n        var parameter = $("#id_parameter").val();\n        if (parameter == 'niederschlag') {\n            $("#id_start_date_year").val(2007);\n        }\n        if (parameter == 'bodentemperatur_5cm') {\n            $("#id_start_date_year").val(1991);\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

但这只会改变用户首先可以看到的值。用户使用 jQuery 选择参数后,如何更改可能的年份或范围?

\n

小智 3

我能想到的解决方案有两种:

\n

有意见

\n

首先创建表单,第一个让您选择类型,第二个为您在“get_first_and_second_year”中所做的选项启动表单:

\n
# forms\n\nclass DataForm(forms.Form): \n    Parameter_CHOICES = [\n        (\'\', \'W\xc3\xa4hle ein Umweltvariable\'),\n        (\'niederschlag\', \'Niederschlag [L/m\xc2\xb2]\'),\n        (\'bodentemperatur_5cm\', \'Bodentemperatur in 5cm Tiefe [\xc2\xb0C]\')\n    ]   \n    parameter = forms.ChoiceField(\n        widget = forms.Select,\n        choices = Parameter_CHOICES\n    )\n\nclass DatePickForm(forms.Form):\n    start_date = forms.DateField(label=\'Beginn:\', widget=forms.SelectDateWidget())\n    end_date = forms.DateField(label=\'Ende:\', initial=datetime.now, widget=forms.SelectDateWidget())\n\n    def __init__(self, *args, **kwargs):\n        # get kwargs\n        first_year = kwargs.pop(\'first_year\', None)\n        second_year = kwargs.pop(\'second_year\', None)\n        # super\n        super(DatePickForm, self).__init__(*args, **kwargs)\n\n        # initialize form fields\n        self.fields[\'start_date\'] = forms.DateField(\n            label=\'Beginn:\', \n            widget=forms.SelectDateWidget(\n                years=list(range(first_year,second_year))\n            )\n        )\n        self.fields[\'end_date\'] = forms.DateField(\n            label=\'Ende:\', \n            widget=forms.SelectDateWidget(\n                years=list(range(first_year,second_year))\n            )\n        )\n
Run Code Online (Sandbox Code Playgroud)\n

使用不同的视图调用页面:

\n
# call in views\n\n\n@login_required(login_url="/login/")\ndef date_form_view(request):\n    form = DataForm(request.POST or None)\n    if request.method == \'POST\':\n        #................................................................\n        #    treat form\n        #................................................................\n        redirect(\'date_pick\', form_choice=form_choice)\n    # render with context \n    context = {\'form\': form}\n    render(request, "", context)\n\n\ndef get_first_and_second_year(form_choice):\n    # return first and second year depending on form choice\n    match form_choice:\n        case \'niederschlag\':\n            return first_year, second_year \n        case \'bodentemperatur_5cm\':\n            return first_year, second_year\n        case _:\n            return 0, 0\n\n\n@login_required(login_url="/login/")\ndef date_form_view(request, form_choice):\n    # dont forget to map url to this view with the argument\n    \n    first_year, second_year = get_first_and_second_year(form_choice)\n    form = DatePickForm(request.POST or None, first_year=first_year, second_year=second_year)\n    if request.method == \'POST\':\n        #................................................................\n        #    treat form\n        #................................................................        \n        start_date = request.POST.get(\'start_date\')\n        # ...\n\n    context = {\'form\': form}\n    render(request, "", context)\n
Run Code Online (Sandbox Code Playgroud)\n

使用ajax(界面更平滑,编码更困难):

\n

Ajax post/get 调用说明 https://www.pluralsight.com/guides/work-with-ajax-django

\n

将 json 字符串传递到描述每个 form_choice 的不同操作的视图:

\n

并在 html 前面添加 form_choice 的表单。

\n