【问题标题】:Looping through list to store variables in dictionary runs in error循环遍历列表以将变量存储在字典中运行错误
【发布时间】:2019-05-31 10:39:26
【问题描述】:

我想做什么: 从 HTML 表单获取用户输入,将输入存储在 Django 中的变量中并使用变量执行计算。

为此,我使用以下代码:

my_var = requst.POST.get('my_var')

为了防止在第一次呈现 Django 页面时将 'None' 存储在 'my_var' 中,我通常使用 if my_var == None: my_var = 1

为了在使用一堆变量时保持简单,我提出了以下想法:

  1. 我将所有变量名存储在一个列表中
  2. 我遍历列表并创建一个字典,其中变量名作为键,用户输入作为值

为此,我在 python 中编写了这段代码,效果很好:

list_eCar_properties = [
'car_manufacturer',
'car_model',
'car_consumption',]

dict_sample_eCar = {
    'car_manufacturer' : "Supr-Duper",
    'car_model' : "Lightning 1000",
    'car_consumption' : 15.8,
}

dict_user_eCar = {
}

my_dict = {
    'car_manufacturer' : None,
    'car_model' : None,
    'car_consumption' : None,
}

for item in list_eCar_properties:
    if my_dict[item] == None:
        dict_user_eCar[item] = dict_sample_eCar[item]
    else:
        dict_user_eCar[item] = my_dict[item]


print(dict_user_eCar)

效果很好 - 当我运行代码时,会创建一个字典 (dict_user_eCar),其中存储了用户输入(在本例中为 None,使用第二个字典 my_dict 模拟)。当用户将输入留空时 - 使用来自 dict_sample_eCar 的数据。

现在,当我将该代码传输到我的 Django 视图时,事情不再那么好了。代码如下:

def Verbrauchsrechner_eAuto(request):
list_eCar_properties = [
    'car_manufacturer',
    'car_model',
    'car_consumption',
]

dict_model_eCar = {
    'car_manufacturer' : "Supr-Duper",
    'car_model' : "Lightning 1000",
    'car_consumption' : 15.8,
}

dict_user_eCar = {
}

for item in list_eCar_properties:
    dict_user_eCar[item] = dict_model_eCar[item]

    context = {
        'dict_user_eCar' : dict_user_eCar,
        'dict_model_eCar' : dict_model_eCar,
        'list_eCar_properties' : list_eCar_properties,
    }

    return render(request, 'eAuto/Verbrauchsrechner_eAuto.html', context = context)

结果:页面仅使用第一个字典条目呈现。所有其他人都被排除在外。在这种情况下,只有 car_manufacturer 被渲染到 html 页面。

【问题讨论】:

  • 您的“return render()”语句位于 for 循环内。在我看来它应该在循环之后。此外,您对“context = {}”的定义似乎也应该在循环之外?
  • 非常感谢您的意见!

标签: html django python-3.x django-views


【解决方案1】:

对不起,伙计们 - 当我正在审查我的帖子时,我意识到我在最后一部分的缩进处有一个重大的错误: context 和 return 都是 for 循环的一部分,这显然会在第一个循环之后导致页面渲染。 我更正了代码如下:

for item in list_eCar_properties:
    dict_user_eCar[item] = dict_model_eCar[item]

context = {
    'dict_user_eCar' : dict_user_eCar,
    'dict_model_eCar' : dict_model_eCar,
    'list_eCar_properties' : list_eCar_properties,
}

return render(request, 'eAuto/Verbrauchsrechner_eAuto.html', context = context)`

因为我不想浪费我写这篇文章的时间——我还是把它发布了——尽管我自己发现了错误。

编程新手的经验教训:

  1. 您自己的代码中有很多 cmets 可能会导致很大的混乱
  2. 力求精确,保持代码整洁
  3. 在在 stackoverflow 中写长篇文章之前执行 1 和 2

也许其他人会从中受益。

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多