Python 以编程方式设置django ModelForm中排除字段的值

Python 以编程方式设置django ModelForm中排除字段的值,python,django,Python,Django,我有一个ModelForm类,我想从表单中排除一个字段(language),并以编程方式添加它。我试图在clean方法中添加语言,但得到了一个IntegrityError(“language\u id”列不能为null”)。我假设这是因为从clean()返回的language的任何数据都将被忽略,因为它位于排除元组中。我在ModelAdmin类中使用表单。我还没有找到任何方法来处理这个问题,所以任何提示或提示都将不胜感激 from django import forms from myapp i

我有一个
ModelForm
类,我想从表单中排除一个字段(
language
),并以编程方式添加它。我试图在clean方法中添加语言,但得到了一个
IntegrityError
“language\u id”列不能为null”
)。我假设这是因为从
clean()
返回的
language
的任何数据都将被忽略,因为它位于排除元组中。我在
ModelAdmin
类中使用表单。我还没有找到任何方法来处理这个问题,所以任何提示或提示都将不胜感激

from django import forms
from myapp import models
from django.contrib import admin


class DefaultLanguagePageForm(forms.ModelForm):
    def clean(self):
        cleaned_data = super(DefaultLanguagePageForm, self).clean()
        english = models.Language.objects.get(code="en")
        cleaned_data['language'] = english

        return cleaned_data

    class Meta:
        model = models.Page
        exclude = ("language",)

class PageAdmin(admin.ModelAdmin):
    form = DefaultLanguagePageForm

您可以做的是在视图中保存表单时,不提交数据。然后可以通过编程方式设置排除字段的值。当我有一个用户字段并且我想排除该字段并设置为当前用户时,我经常遇到这种情况

form = form.save(commit=False)
form.language = "en"
form.save()

这里有更多关于commit=False-->

的信息,我没有显式调用表单,因为我将表单用于ModelAdmin类。但也许我可以在ModelAdmin上使用一些钩子。当我再次在我的电脑前时,我会研究它。看起来我可以使用ModelAdmin.save_model(request,obj,form,change)(),所以我想我实际上不需要访问表单实例。不过谢谢你的提示,我很可能会在下次找到commit=False的用法。@JoarLeth,如果你已经确定了一个解决方案,那么如果你将其报告为答案并接受你的答案,这将是很有帮助的。