python - 如何将 m2m 现场 session 从一个表单保存到另一个表单?

标签 python django django-forms

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

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

这是我的 View 文件:

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

我怎样才能实现我想要实现的目标?

最佳答案

首先尝试保存对象:

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

问题是您需要在使用多对多关系之前保存对象。请参阅docs :

You can’t associate it with a Publication until it’s been saved

关于python - 如何将 m2m 现场 session 从一个表单保存到另一个表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41293674/

相关文章:

python - 如何解决Django ValueError : Field 'id' expected a number

django - 使用 ModelForm 编辑模型实例会创建新实例而不是更新

python - 在 Python 中使用 html2text 并清理一些文本

python - "chunk"、 "block"、 "offset"、 "buffer"和 "sector"是什么意思?

python - 使用 Python 对契约(Contract)桥接分数的 elasticsearch json 对象的元素进行计算

python - PyQt- 哪一列获得了右键单击?

python - 在 Django 中接受电子邮件地址作为用户名

Python:Django 请求

python - 如何在表单向导中使用 ModelFormSet

python - Django Form 不从类 HomeForm 渲染 HTML