Django form.save() 错误
Django form.save() error
我的模特:
class Event(models.Model):
title = models.CharField(max_length=255)
start = models.DateTimeField()
end = models.DateTimeField()
theme = models.ForeignKey(Theme)
class Theme(models.Model):
name = models.CharField(max_length=100)
color = models.CharField(max_length=50)
text_color = models.CharField(max_length=50)
我的表格:
class EventForm(ModelForm):
class Meta:
model = Event
fields = ['title', 'start', 'end']
theme = forms.ModelChoiceField(
queryset=Theme.objects.filter(public=True),
empty_label='None'
)
我的看法:
@login_required
def index(request):
if request.method == 'POST':
form = EventForm(request.POST)
if form.is_valid():
form.save()
现在,如果我从 django 为我创建的列表中填写星号、结尾、标题和 select 主题中的值,当我尝试 运行 时出现错误form.save() 方法。
IntegrityError: null value in column "theme_id" violates not-null constraint
但是当我查看 form.cleaned_data 时,我可以看到主题中有一个可用的主题模型实例。
如果没有 Theme
对象,您将无法保存 Event
,因此您需要
form = EventForm(request.POST)
if form.is_valid():
# get your Theme object 'your_theme_object'
event = form.save(commit=False)
event.theme = your_theme_object
event.save()
我应该发表评论,但我没有足够的观点。
我认为实现此目标的更好方法是:
class EventForm(ModelForm):
class Meta:
model = Event
fields = ['title', 'start', 'end', 'theme']
由于 'theme' 是事件模型的外键,它会在您的模板中显示为下拉列表。
由于这里要过滤主题对象,可以通过重写 init :
来实现
class EventForm(ModelForm):
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['theme'].queryset = self.fields['theme'].queryset.filter(public=True)
class Meta:
model = Event
fields = ['title', 'start', 'end', 'theme']
我的模特:
class Event(models.Model):
title = models.CharField(max_length=255)
start = models.DateTimeField()
end = models.DateTimeField()
theme = models.ForeignKey(Theme)
class Theme(models.Model):
name = models.CharField(max_length=100)
color = models.CharField(max_length=50)
text_color = models.CharField(max_length=50)
我的表格:
class EventForm(ModelForm):
class Meta:
model = Event
fields = ['title', 'start', 'end']
theme = forms.ModelChoiceField(
queryset=Theme.objects.filter(public=True),
empty_label='None'
)
我的看法:
@login_required
def index(request):
if request.method == 'POST':
form = EventForm(request.POST)
if form.is_valid():
form.save()
现在,如果我从 django 为我创建的列表中填写星号、结尾、标题和 select 主题中的值,当我尝试 运行 时出现错误form.save() 方法。
IntegrityError: null value in column "theme_id" violates not-null constraint
但是当我查看 form.cleaned_data 时,我可以看到主题中有一个可用的主题模型实例。
如果没有 Theme
对象,您将无法保存 Event
,因此您需要
form = EventForm(request.POST)
if form.is_valid():
# get your Theme object 'your_theme_object'
event = form.save(commit=False)
event.theme = your_theme_object
event.save()
我应该发表评论,但我没有足够的观点。 我认为实现此目标的更好方法是:
class EventForm(ModelForm):
class Meta:
model = Event
fields = ['title', 'start', 'end', 'theme']
由于 'theme' 是事件模型的外键,它会在您的模板中显示为下拉列表。 由于这里要过滤主题对象,可以通过重写 init :
来实现class EventForm(ModelForm):
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['theme'].queryset = self.fields['theme'].queryset.filter(public=True)
class Meta:
model = Event
fields = ['title', 'start', 'end', 'theme']