Python 将值从django动态字段传递回视图
我已经寻找了很多关于这个问题的答案,我确信这是我所缺少的最基本的东西。我想在django中将一个参数传递成动态形式。表单根据传递给它的值动态填充ChoiceField,但在提交表单时,我得到了“location\u choice”的一个关键错误 表单获得一个location_选项(实际上是一个组),然后根据该过滤器选择一个相关位置的列表,并用每个位置的PK值填充下拉列表。我不能做的是提交该表单并将该值传递回后续视图。我无法传回任何数据,因为我收到一个密钥错误 我花了几个小时试图理解我在这里做错了什么,包括阅读这篇文章,这篇文章很有帮助,但我仍然遗漏了一些东西: views.pyPython 将值从django动态字段传递回视图,python,django,forms,Python,Django,Forms,我已经寻找了很多关于这个问题的答案,我确信这是我所缺少的最基本的东西。我想在django中将一个参数传递成动态形式。表单根据传递给它的值动态填充ChoiceField,但在提交表单时,我得到了“location\u choice”的一个关键错误 表单获得一个location_选项(实际上是一个组),然后根据该过滤器选择一个相关位置的列表,并用每个位置的PK值填充下拉列表。我不能做的是提交该表单并将该值传递回后续视图。我无法传回任何数据,因为我收到一个密钥错误 我花了几个小时试图理解我在这里做错了
def test_search(request):
form = search_criteria(request.POST or None, location_choice="Group A")
return render(request, 'utilisation/util_search_day_theatre.html', { 'form': form })
forms.py
class search_criteria(forms.Form):
start_date = forms.DateField(label='Start Date', required = False, input_formats=['%d/%m/%y', '%d/%m/%Y'], initial="1/1/16")
end_date = forms.DateField(label='End Date', required = False, input_formats=['%d/%m/%y', '%d/%m/%Y'], initial='1/5/16')
dayofweek_dataset = dayofweek.objects.all().values_list()
dayofweek_choice = forms.ChoiceField(required=True, label='Choose a Day of the Week:', choices= dayofweek_dataset, initial=2)
def __init__(self, *args,**kwargs):
self.location_choice= kwargs.pop('location_choice')
super(search_criteria,self).__init__(*args,**kwargs)
location_query = locationslist.objects.filter(location_group__exact=self.location_choice).values_list('id','location').order_by('id').distinct()
self.fields['location_choice'] = forms.ChoiceField(required=True, label='Choose a Location', choices= location_query)
def location_choice(self):
yield (self.fields[location_choice].label, value)
源代码告诉我ChoiceField正在填充下拉菜单,正如我所期望的那样,为特定组中的每个位置填充正确的PK
提交表单时,我收到一个关键错误:
Traceback Switch to copy-and-paste view
/Library/Python/2.7/site-packages/django/core/handlers/exception.py in inner
response = get_response(request) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/core/handlers/base.py in _get_response
response = self.process_exception_by_middleware(e, request) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/core/handlers/base.py in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/Users/TD3/django/tass/utilisation/views.py in generic_render
form_data = search_criteria(request.POST) ...
▶ Local vars
/Users/TD3/django/tass/utilisation/forms.py in __init__
self.location_choice= kwargs.pop('location_choice') ...
▶ Local vars
views.generic_render中唯一的功能是表单验证步骤,如果表单数据有效,则HttpResponse为“success”。一旦我能够解决如何将数据输入到视图中,我将建立该视图,因为它将对表单数据执行许多其他操作。我目前作为几个硬编码视图使用,每个位置组有一个单独的视图。我只想让它成为pythonic(尽我所能),并拥有一个通用搜索视图和一个通用显示视图
def generic_render(request):
if request.method == 'POST':
form_data = search_criteria(request.POST)
if form_data.is_valid():
return HttpResponse("Success")
else:
return HttpResponse("Form data not valid")
我不明白你为什么在这里使用两个视图。但是,既然是这样,就需要记住将
location\u choice
参数从这两个参数传递到表单中
(还要注意我在评论中提到的一点:您的表单方法
location\u choice
正被同名属性覆盖。无论如何,我怀疑您是否需要该方法。)请显示完整的回溯。是什么导致了KeyError?但是请注意,您对属性和方法都使用了名称location\u choice
;在Python中不能这样做,一个将覆盖另一个。谢谢,我已编辑以显示完整的回溯。该回溯显示您使用的视图与您发布的视图完全不同,即generic\u render
。我已添加generic\u render视图。目前它仅作为表单验证工具存在。谢谢你的帮助!谢谢你,这是显而易见的,现在你指出它。因此,表单检查器需要与表单相同的输入来检查表单;它的有效性。我在下一个视图中看到的“form_data”只是一个输出,而不是检查输入的反馈循环。多谢各位,我会在适当时候整理意见。显然,我的选票不存在;我不会说的,但我会在这里表示感谢的。没问题。我不知道为什么选票没有显示出来,但你应该可以点击绿色复选框,将答案标记为接受。我是个新手。它很重要,但没有显示。
form_data = search_criteria(request.POST, location_choice="Group A")