Django,将已排除的属性添加到提交的模型中

Sve*_*len 11 django django-models django-forms modelform

我有一个模型,我排除了两个字段,create_datecreated_by字段和字段.现在我在使用该save()方法时出现"Not Null"错误,因为它created_by是空的.

我试图在这样的save()方法之前将用户ID添加到表单:form.cleaned_data['created_by'] = 1form.cleaned_data['created_by_id'] = 1.但这一切都不起作用.

有人可以向我解释我如何"添加"其他东西到提交的模型中,以便它可以节省吗?

class Location(models.Model):
    name = models.CharField(max_length = 100)
    created_by = models.ForeignKey(User)
    create_date = models.DateTimeField(auto_now=True)

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        exclude = ('created_by', 'create_date', )
Run Code Online (Sandbox Code Playgroud)

Kon*_*ant 18

由于您已经排除了字段created_bycreate_date表单,因此尝试分配它们form.cleaned_data没有任何意义.

这是你可以做的:

如果您有视图,则只需使用form.save(commit=False)然后设置值即可created_by

def my_view(request):
    if request.method == "POST":
        form = LocationForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.created_by = request.user
            obj.save()
        ...
        ...
Run Code Online (Sandbox Code Playgroud)

`

如果您使用的是Admin,则可以覆盖save_model()方法以获得所需的结果.

class LocationAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.created_by = request.user
        obj.save()
Run Code Online (Sandbox Code Playgroud)


Iva*_*yan 5

将用户作为参数传递给表单构造函数,然后使用它来设置模型实例的 created_by 字段:

def add_location(request):
    ...
    form = LocationForm(user=request.user)
    ...

class LocationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        self.instance.created_by = user
Run Code Online (Sandbox Code Playgroud)