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()
kwargs['user'] = self.request.user
return kwargs
def get(self, request, *args, **kwargs):
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)
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- .