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。但是,如果我保存表单,则用户选择的是保存的元素数据。
在保存表单之前如何处理表单数据并保留许多原字段数据?
预先感谢
答案 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 theUser
model section of the documentation。
注意:您可以将视图限制为使用
@login_required
decorator [Django-doc]。