Django success url using kwargs

I am trying to modify my get_success_url so that if any kwargs passed to it, I can create a return url using them.

Here is what I still have:

 class CalcUpdate(SuccessMessageMixin, UpdateView): model = Calc template_name = 'calc/cru_template.html' form_class = CalcForm def archive_calc(self, object_id): model_a = Calc.objects.get(id = object_id) model_b = Calc() for field in model_a._meta.fields: setattr(model_b, field.name, getattr(model_a, field.name)) model_b.pk = None model_b.save() self.get_success_url(idnumber = model_b.pk) def form_valid(self, form): #objects if self.object.checked == True: object_id = self.object.id self.archive_calc(object_id) #save def get_success_url(self, **kwargs): if kwargs != None: return reverse_lazy('detail', kwargs = {'pk': kwargs['idnumber']}) else: return reverse_lazy('detail', args = (self.object.id,)) 

For now, it just gives keyerror detailed description of 'idnumber' .

I typed kwargs['idnumber'] and it returns pk as expected, but I just can't see where I'm wrong.

Thanks in advance.

+3
source share
2 answers

form_valid should return an HttpResponseRedirect https://github.com/django/django/blob/master/django/views/generic/edit.py#L100 , which in your case will never be. I don't know if you have code after #save , but look at the comments I made in your code.

 class CalcUpdate(SuccessMessageMixin, UpdateView): model = Calc template_name = 'calc/cru_template.html' form_class = CalcForm def archive_calc(self, object_id): model_a = Calc.objects.get(id = object_id) model_b = Calc() for field in model_a._meta.fields: setattr(model_b, field.name, getattr(model_a, field.name)) model_b.pk = None model_b.save() return self.get_success_url(idnumber = model_b.pk) # you never return this value def form_valid(self, form): #objects if self.object.checked == True: object_id = self.object.id return HttpResponseRedirect(self.archive_calc(object_id)) # you never return a `HttpResponse` #save -- If this is where you are saving... you can store the value from archive and return it after saving def get_success_url(self, **kwargs): if kwargs != None: return reverse_lazy('detail', kwargs = {'pk': kwargs['idnumber']}) else: return reverse_lazy('detail', args = (self.object.id,)) 

Also, you do not need to manually copy the fields, just do it (if there are no unique constraints, because if they were, your version would also fail):

  def archive_calc(self, object_id): c = self.model.objects.get(id = object_id) c.pk = None c.save() return self.get_success_url(idnumber = c.pk) 
+4
source

After playing with @Ngenator's answer and other posts here, I have the following working code. However, it is not very nice to watch :(

 def get_success_url(self): if self.pknumber != None: return reverse_lazy('pstdetail', args = (self.pknumber,)) else: return reverse_lazy('pstdetail', args = (self.object.id,)) 

I have this self.pknumber = model_b.pk in the right place in the view and self.pknumber = None else, where to include the if statement to create the required URL. Hope this helps everyone and feel free to point out any bugs / improvements.

+1
source

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


All Articles