Django, adding excluded properties to the submitted modelform

流过昼夜 提交于 2019-12-09 04:42:32

问题


I've a modelform and I excluded two fields, the create_date and the created_by fields. Now I get the "Not Null" error when using the save() method because the created_by is empty.

I've tried to add the user id to the form before the save() method like this: form.cleaned_data['created_by'] = 1 and form.cleaned_data['created_by_id'] = 1. But none of this works.

Can someone explain to me how I can 'add' additional stuff to the submitted modelform so that it will save?

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', )

回答1:


Since you have excluded the fields created_by and create_date in your form, trying to assign them through form.cleaned_data does not make any sense.

Here is what you can do:

If you have a view, you can simply use form.save(commit=False) and then set the value of 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()
        ...
        ...

`

If you are using the Admin, you can override the save_model() method to get the desired result.

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



回答2:


Pass a user as a parameter to form constructor, then use it to set created_by field of a model instance:

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



回答3:


The correct solution is to pass an instance of the object with pre-filled fields to the model form's constructor. That way the fields will be populated at validation time. Assigning values after form.save() may result in validation errors if fields are required.

LocationForm(request.POST or None, instance=Location(
    created_by=request.user,
    create_date=datetime.now(),
))

Notice that instance is an unsaved object, so the id will not be assigned until form saves it.




回答4:


One way to do this is by using form.save(commit=False) (doc)

That will return an object instance of the model class without committing it to the database.

So, your processing might look something like this:

form = some_form(request.POST)
location = form.save(commit=False)
user = User(pk=1)
location.created_by = user
location.create_date = datetime.now()
location.save()


来源:https://stackoverflow.com/questions/5831845/django-adding-excluded-properties-to-the-submitted-modelform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!