使用ModelForm Django保存ManytoManyField时出现问题

时间:2020-07-26 09:08:12

标签: django django-forms manytomanyfield

models.py

from django.db import models
from django.contrib.auth.models import User


class Elements(models.Model):
    element = models.CharField(max_length=10, unique=True)

    def __str__(self):
        return self.element


class Hero(models.Model):
    added = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    name = models.CharField(max_length=10, unique=True)
    element = models.ManyToManyField(Elements, blank=True)

    def __str__(self):
        return self.name

forms.py

from django import forms
from .models import Elements, Hero


class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero
        exclude = [
            'added'
        ]
        widgets = {
            'element': forms.CheckboxSelectMultiple
        }

views.py

from django.shortcuts import render
from .forms import HeroForm


def home(request):
    form = HeroForm(request.POST or None)
    if form.is_valid():
        hero = form.save(commit=False)
        hero.added = request.user
        hero.save()


        form = HeroForm()

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

每当我尝试保存之前操纵模型时,就像我在views.py中上面显示的那样,元素的(manytoamyfield)数据会自动设置为null。但是,如果我保存表单,则用户选择的是保存的元素数据。

在保存表单之前如何处理表单数据并保留许多原字段数据?

预先感谢

enter image description here

1 个答案:

答案 0 :(得分:2)

如果使用commit=False,则ModelForm无法保存多对多关系,因为该对象没有主键。

您可以简单地以之前的形式更改实例,保存表单:

from django.contrib.auth.decorators import login_required

@login_required
def home(request):
    if request.method == 'POST':
        form = HeroForm(request.POST)
        if form.is_valid():
            form.instance.added = request.user
            form.save()  # no commit=False
            form = HeroForm()
    else:
        form = HeroForm()
    return render(request, 'home.html', {'form': form})

注意:如果POST请求成功,则应进行redirect [Django-doc] 实现Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新页面时发出相同的POST请求。 浏览器。


注意:与直接使用settings.AUTH_USER_MODEL [Django-doc]相比,通常最好使用User model [Django-doc]来引用用户模型。有关更多信息,请参见referencing the User model section of the documentation


注意:您可以将视图限制为使用 @login_required decorator [Django-doc]

相关问题