【问题标题】:Saving values to django model through a for loop通过 for 循环将值保存到 django 模型
【发布时间】:2021-12-30 09:49:14
【问题描述】:

我想使用字典通过模型表单和视图将值存储在模型中。今天我是这样解决的:

form.variable_1 = dictionary['variable_1']
form.variable_2 = dictionary['variable_2']
form.variable_3 = dictionary['variable_3']
form.variable_4 = dictionary['variable_4']
form.variable_5 = dictionary['variable_5']
form.variable_6 = dictionary['variable_6']

字典中的键与我要存储的值的字段名称相同。我想让这个函数更 Pythonic - 像这样:

for field in form: 
    form.field = dictionary['field']

但是,我不确定如何使用 Django ORM 来实现这一点。我要迭代的字段在字段列表中编号为 3-28,所以我想我必须以某种方式对字段进行切片并基于此创建一个列表?

编辑:

models.py

class MyModel(Model):
user = ForeignKey(settings.AUTH_USER_MODEL, on_delete=CASCADE)
Instance_name = CharField(max_length=200, default='')
Instance_text = TextField(default='')
variable_1 = IntegerField(null=True)

后面一共有30个变量,比如变量1。

forms.py:

class MyModelMF(ModelForm):
class Meta:
    model = MyModel
    fields = [
        'Instance_name',
        'Instance_text'
    ]

    widgets = {
        'Instance_text': Textarea(attrs={"style": "height:4em;" "width:25em;"})
    }

views.py(直到迭代开始,为简单起见,排除返回渲染等)

def create_instance(request):
form = MyModelMF()
if request.method == 'POST':
    form = MyModelMF(request.POST)
    if form.is_valid()
        form = form.save(commit=False)
        form.user = request.user
        form.variable_1 = scores_dict['variable_1']

【问题讨论】:

  • 你能分享你的模型、表格和视图吗?如果使用 ModelForm,为什么要从 dict 手动分配值而不是从 request.POST 填充表单?
  • 我已编辑问题以添加代码示例。这些值是通过一个字典添加的,该字典是根据用户在模板上输入的函数生成的,因此每次保存的值都是不同的,而不是手动输入。
  • 可以分享生成scores_dict的函数吗? dict 中的所有键是否都完全映射到模型上的字段?
  • 我可以,但我认为它不会添加任何相关内容。字典中的每个键都映射到模型中的一个字段,因此编写 form.variable_2 = score_dict['variable_2'] 等现在可以正常工作,但它不像我想要的那样 Python 或可扩展。

标签: python django django-models django-orm


【解决方案1】:

您可以使用内置函数setattr 按名称设置实例的属性。遍历dict中的键和值,调用setattr时使用键作为属性名

if form.is_valid()
    form = form.save(commit=False)
    form.user = request.user
    for field_name, value in scores_dict.items():
        setattr(form, field_name, value)
    form.save()

【讨论】:

  • 好答案。值得注意的是,如果用户可以控制scores_dict,他们可以覆盖form 对象的部分内容。例如,如果他们可以让scores_dict 包含一个名为“用户”的键,那么他们可以覆盖表单的user 字段,这可能不是有意的。在不知道scores_dict是如何生成的情况下,我们不能说这段代码是否引入了漏洞。
  • 这就像一个魅力,节省了大量的空间 - 漂亮!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2021-09-30
  • 2019-08-09
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多