[Django]-How to set a field of the model in view using generic views?

2👍

I’ve modified my generic view subclass as such:

class AppointmentCreateView(CreateView):        
    model=Appointment
    form_class = AppointmentCreateForm

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        # the actual modification of the form
        form.instance.author = request.user

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

There are few important parts here:

  • I modified form instance field, which holds the actual model that’s going to be saved.
  • You can of course get rid of the form_class
  • The post method that I’ve needed to modify was two classes above in hierarchy, so I needed to incorporate the base code and the self.object = None line, merging the overload and base into one function (I’m not calling super in post).

I think it’s a good way to solve pretty common problem, and once again I don’t have to write my own custom view.

7👍

The following seem slightly simpler. Note that self.request is set in View.as_view

class AppointmentCreateView(CreateView):        
    model=Appointment
    form_class = AppointmentCreateForm

    def get_form(self, form_class):
        form = super(AppointmentCreateView, self).get_form(form_class)
        # the actual modification of the form
        form.instance.author = self.request.user
        return form

Leave a comment