Django Generic View UpdateView Redirect URL with Updated slug Version

This is my update, which is invoked by a url with a slug field like

/mymodel/update/<model_name_slug>/

MyModelhave two fields: nameand slug. The merge field is <model_name_slug>automatically generated from MyModel.name. If the user updates it, a new bullet field will be created. Then I want to redirect to this new url with the newly created slug field.

The automatic generation of the field works. It is implemented in MyModelEditForm. However, the code below will not work. The reason is that:

1) The user typed this URL to update an existing model

/mymodel/update/example-model

2) The user changes the Name attribute to "example model changed". Then the slug field will be generated as "example-model-changed"in MyModel.

3) URL- "/mymodel/update/example-model-changed", get_object() None. get() URL "example-model-changed" "example-model"

? self.object, :

 MyModelUpdateView object has no attribute 'object'

:

class MyModelUpdateView(LoginRequiredMixin, UpdateView):
    model = MyModel
    form_class = MyModelUpdateForm
    template_name = 'mymodel/update_mymodel.html'

    def get_success_url(self):
        view_name = 'update_mymodel'
        return reverse_lazy(view_name, kwargs={'model_name_slug': self.kwargs.get('model_name_slug','')})

    def get_form_kwargs(self):
        '''
        This injects form with keyword arguments.
        '''
        kwargs = super(MyModelUpdateView, self).get_form_kwargs()
        #Update the kwargs with the user_id
        kwargs['user'] = self.request.user
        return kwargs

    def get(self, request, *args, **kwargs):
        # self.object = self.get_object()
        if self.request.path != self.object.get_absolute_url():
            return HttpResponseRedirect(self.object.get_absolute_url())
        else:
            return super(MyModelUpdateView, self).get(request,*args, **kwargs)
            # context = self.get_context_data(object=self.object)
            # return self.render_to_response(context)

    def get_object(self, queryset=None):
        instance = MyModel.objects.get(slug=self.kwargs.get('model_name_slug',''))
        return instance

get_success_url() , get_object(), , : 1) "-"; 2) "--" , URL- .

+4
3

self.get_object get_success_url. form_valid() self.object , self.object.slug URL-.

def get_success_url(self):
    view_name = 'update_mymodel'
    # No need for reverse_lazy here, because it called inside the method
    return reverse(view_name, kwargs={'model_name_slug': self.object.slug})
+4

, , ...

def get_success_url(self):
        view_name = 'update_mymodel'
        return reverse_lazy(view_name, kwargs={'model_name_slug': self.kwargs.get('model_name_slug','')})

get_success_url URL-, , , ?

self.get_object().model_name_slug

, atm.

1) , " ", slug field;

URL- . URL? get_success_url?. , reverse_lazy(view_name, kwargs={'model_name_slug': self.get_object().model_name_slug}) ?

2) "--" , URL .

0

.

, ! , URL, .

URL- stackoverflow. ? , . 33115530 - pk, . !

get_object the, get_success_url slug, .

0

Source: https://habr.com/ru/post/1611525/


All Articles