【问题标题】:django - form.cleaned_data[] for all fields in modeldjango - 模型中所有字段的 form.cleaned_data[]
【发布时间】:2017-06-19 12:21:19
【问题描述】:

我正在使用 django 将表单数字化。这个表格有点复杂,里面有很多字段。我想知道 Django 是否可以为所有字段执行 form.cleaned_data[],而不是为每个字段分开声明像 obj.fieldname = form.cleaned_data['fieldname'] 这样的变量。

我在 views.py 中使用 forloop 进行了尝试,但这不起作用

这就是我说的forloop:

def get_form_naw(request):
    if request.method == 'POST':
        form = Form1(request.POST)
        if form.is_valid():
            for x in Model1():
                formname = x.name
                o = Model1()
                o.formname = form.cleaned_data[formname]
            o.save()
    else:
        form = Form1
    return render(request, 'folder/home.html', context=locals())

我正在使用 mysql 数据库。我的表格是这样声明的: forms.py

class Form1(forms.ModelForm):

    class Meta:
        model = Model1
        exclude = ('id')

【问题讨论】:

  • 您可以直接保存表单来创建对象。为什么需要逐字段创建对象?
  • 您的排除项缺少尾随逗号,即('id',)。但是,您不需要排除 id 字段,因为默认情况下不会包含它。

标签: python mysql django forms


【解决方案1】:

您不必遍历这些字段。您正在使用模型表单,因此您应该只使用save 表单:

if form.is_valid():
    obj = form.save()
    ...

如果确实需要动态设置字段,可以使用setattr

fieldname = 'username'
value = 'my_user'
setattr(obj, fieldname, value)  

【讨论】:

    【解决方案2】:

    您可以像这样在保存之前获取数据的实例:

    if form.is_valid():
        obj = form.save(commit=False) #get instance without saving
        # do your thing
        obj.save() #save into database
    

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2011-04-19
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多