til*_*bra 5 html javascript forms django django-forms
我有一个 Django 表单,用户可以在选择字段中选择变量,在选择日期小部件中选择开始日期和结束日期。对于不同的变量,可能的开始和结束日期有所不同。该表格有效,但所有变量仅适用于一个预定义的日期范围。如何根据变量更改可能的开始和结束日期?
\nfrom 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))
是否可以在 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
首先创建表单,第一个让您选择类型,第二个为您在“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)\nAjax post/get 调用说明 https://www.pluralsight.com/guides/work-with-ajax-django
\n将 json 字符串传递到描述每个 form_choice 的不同操作的视图:
\n并在 html 前面添加 form_choice 的表单。
\n 归档时间: |
|
查看次数: |
647 次 |
最近记录: |