【问题标题】:Django form.save() errorDjango form.save() 错误
【发布时间】:2015-03-11 11:53:24
【问题描述】:

我的模特:

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 为我创建的列表中选择一个主题,当我尝试运行 form.save() 方法时会出现错误。

IntegrityError: null value in column "theme_id" violates not-null constraint

但是当我查看 form.cleaned_data 时,我可以看到在主题中是我的主题模型的一个实例可用。

【问题讨论】:

  • 我很确定您需要在您的fields 中包含theme

标签: django forms


【解决方案1】:

如果没有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()

【讨论】:

  • 我知道。但是为什么我不能使用 form.save()?我的意思是主题对象已经在表单对象中可用。这是cleaned_data的输出: {'start': datetime.datetime(2015, 1, 1, 12, 0, tzinfo=), 'theme': , 'end': datetime.datetime(2015, 1, 2, 12, 0, tzinfo=), 'title': u'测试'}
【解决方案2】:

我应该发表评论,但我没有足够的观点。 我认为实现这件事的更好方法是:

class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = ['title', 'start', 'end', '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']

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多