Django, adding excluded properties to the submitted modelform
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()
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
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.