【问题标题】:Django accessing formset dataDjango 访问表单集数据
【发布时间】:2013-08-24 03:41:17
【问题描述】:

我无法访问通过我的表单集提交的数据。这是我的代码:

模板:

<form action="" method="post">
    {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}

    {{ form.as_p }}

    {% endfor %}

    <input type="submit" value="Submit">

</form>

查看:

def addMembers(request, id, members):
    if request.user.is_authenticated():
        members = int(members)
        MemberFormSet = formset_factory(MemberForm, extra = members)
        if request.method == 'POST':
            print 'post'
            formset = MemberFormSet(request.POST)
            if formset.is_valid():
                cd = formset.cleaned_data
                for f in formset:
                    first_name = cd.first_name
                    last_name = cd.last_name
                    email = cd.email
                    house = House.objects.get(id = id)
                    member = Member(first_name = first_name, last_name = last_name, email = email, house = house, created_on = timezone.now())
                    member.save()
                return HttpResponseRedirect(reverse('houses:controlPanel'))
        else:
            formset = MemberFormSet()
        return render_to_response('houses/add_members.html', {'formset' : formset}, context_instance = RequestContext(request))
    return HttpResponseRedirect(reverse('allauth.account.views.login'))

除了当前写入的内容之外,我还尝试了几种访问数据的方法,包括: f['attribute'] cd['attribute'] request.POST['attribute'] formset.cleaned_data['attribute']

我收到的错误范围从 u"Key 'email' not found in Form"list indices must be integers, not str

我应该如何访问表单集提交的数据? Django 的文档未能对此给出明确的答案,四处搜索我发现了许多不同的方法,但还没有一个有效的方法。感谢您的帮助。

【问题讨论】:

    标签: django forms formset


    【解决方案1】:

    我认为您应该使用 model_formsetfactory,甚至更好的是 inlineformset_factory。您正在从表单数据填充模型,这是它们的设计目的。使用 commit=False 从表单集中获取脏模型,并添加您的 House 关系。像这样的:

    MemberFormSet = model_formset_factory(Member, extra= members)
    if request.method == POST:
        formset = MemberFormSet(request.POST)
        if formset.is_valid():
            house = House.objects.get(id = id)
            models = formset.save(commit=False)
            for member in models:
                member.house = house
                member.save()
            return render(<your data>)
    else:
        formset = MemberFormSet()
    return render(<your data>)
    

    请注意,如果 House 对象不存在,您的 get() 也会抛出异常。只是设计考虑。

    【讨论】:

      【解决方案2】:

      cd 是一本字典。此外,您可能希望从单个表单而不是表单集获取字典值

      if request.method == 'POST':
          formset = MemberFormSet(request.POST)
          if formset.is_valid():
              for f in formset: 
                  cd = f.cleaned_data
                  first_name = cd.get('first_name')
                  last_name = cd.get('last_name')
                  email = cd.get('email')
                  house = House.objects.get(id = id)
                  member = Member(first_name = first_name, last_name = last_name, email = email, house = house, created_on = timezone.now())
                  member.save()
              return HttpResponseRedirect(reverse('houses:controlPanel'))
      

      【讨论】:

      • 你不需要检查f.is_valid()。一个表单集是无效的,除非它的所有表单都有效。
      • 在 is_valid 之前有什么方法可以检查这个?
      • 我认为这不会再违反直觉了。感谢您理解这一切。
      • 我是唯一一个认为 formset.save() 会清理每个表单并将每个表单的清理数据保存到其各自实例的人吗?
      • @PeterDeGlopper 在 django-1.8.6 中,您的声明似乎不再有效。我怀疑 In formset
        _clean 方法没有在单个表单上被调用。
      猜你喜欢
      • 2012-01-27
      • 2019-04-17
      • 2018-11-19
      • 2019-03-10
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多