Python 将值从django动态字段传递回视图

Python 将值从django动态字段传递回视图,python,django,forms,Python,Django,Forms,我已经寻找了很多关于这个问题的答案,我确信这是我所缺少的最基本的东西。我想在django中将一个参数传递成动态形式。表单根据传递给它的值动态填充ChoiceField,但在提交表单时,我得到了“location\u choice”的一个关键错误 表单获得一个location_选项(实际上是一个组),然后根据该过滤器选择一个相关位置的列表,并用每个位置的PK值填充下拉列表。我不能做的是提交该表单并将该值传递回后续视图。我无法传回任何数据,因为我收到一个密钥错误 我花了几个小时试图理解我在这里做错了

我已经寻找了很多关于这个问题的答案,我确信这是我所缺少的最基本的东西。我想在django中将一个参数传递成动态形式。表单根据传递给它的值动态填充ChoiceField,但在提交表单时,我得到了“location\u choice”的一个关键错误

表单获得一个location_选项(实际上是一个组),然后根据该过滤器选择一个相关位置的列表,并用每个位置的PK值填充下拉列表。我不能做的是提交该表单并将该值传递回后续视图。我无法传回任何数据,因为我收到一个密钥错误

我花了几个小时试图理解我在这里做错了什么,包括阅读这篇文章,这篇文章很有帮助,但我仍然遗漏了一些东西:

views.py

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")