如何将m2m字段会话从表单保存到另一个?

时间:2016-12-23 00:38:06

标签: python django django-forms

我正在做一个多步骤表单,最后保存所有内容。在我的模型中,我有一个m2m复选框字段,我使用django Sessions来获取表单数据以在最后一步显示它。

问题是我提交最终表单时不会保存m2m字段(复选框)。

这是我的观点文件:

views.py

def step1(request):
    initial={'name': request.session.get('name', None), 'checkbox': request.session.get('checkbox', (False,))} #cookies
    form = FormOneForm(request.POST or None, initial=initial)
    if request.method == 'POST':
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            request.session['checkbox'] = form.cleaned_data.get('checkbox')
            return HttpResponseRedirect(reverse('step2'))
    return render(request, 'step1.html', {'form': form})

def step2(request):
    form = FormTwoForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            formtwo = form.save(commit=False)
            formone2 = FormOne.objects.create(checkbox=request.session.get('checkbox')) #error is here
            formone = FormOne.objects.create(name=request.session['name'])
            formtwo.owner = formone
            formtwo.save()
            formone2.save_m2m()
            return HttpResponseRedirect(reverse('step3'))

    return render(request, 'step2.html', {'form': form})

models.py

class Font(models.Model):
    font_name = models.CharField(max_length=100)
    font_family = models.CharField(max_length=100)
    font_link = models.CharField(max_length=100)
    ...

class FormOne(models.Model):
    name = models.CharField(max_length=40)
    checkbox = models.ManyToManyField(Font, blank=True)
    ...

class FormTwo(models.Model):
    owner = models.ForeignKey(FormOne)
    name = models.CharField(max_length=40)
    ...

这段代码给了我这个错误:

'checkbox' is an invalid keyword argument for this function

我如何实现我想要实现的目标?

1 个答案:

答案 0 :(得分:1)

首先尝试保存对象:

formone2 = FormOne.objects.create(name=request.session['name'])
formone2.checkbox.add(request.session.get('checkbox')

问题是你需要在使用多对多关系之前保存对象。见docs

  

在保存之前,您无法将其与出版物相关联