This is my update, which is invoked by a url with a slug field like
/mymodel/update/<model_name_slug>/
MyModel
have two fields: name
and 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- .