Django成功网址使用kwargs [英] Django success url using kwargs

查看:127
本文介绍了Django成功网址使用kwargs的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在修改我的 get_success_url ,以便如果任何 kwargs 已经传递给它,我可以建立返回的网址使用它们。

I am trying to amend my get_success_url so that if any kwargs have been passed to it, I can build the returned url using them.

还有我到目前为止:

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,))

到目前为止,这只是给出了一个 keyerror 详细说明'idnumber'

So far this just gives a keyerror detailing 'idnumber'.

我打印了 kwargs ['idnumber'] ,并按预期返回 pk 不过我似乎看不到我在哪里出错了。

I have printed kwargs['idnumber'] and it returns the pk as expected however I just cant seem to see where I am going wrong with this.

提前感谢

推荐答案

form_valid 应该返回一个 HttpResponseRedirect https://github.com/django/django/blob/master/django/views/generic /edit.py#L100 在你的情况下,你永远不会这样做。我不知道你在 #save 之后是否有任何代码,但是请查看我在代码中所做的评论

form_valid should return a HttpResponseRedirect https://github.com/django/django/blob/master/django/views/generic/edit.py#L100 which in your case, you never do. I dont know if you have any code after #save, but take a 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 don't need to manually copy the fields, just do (assuming there are no unique constraints because if there were, your version would fail too):

    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)

这篇关于Django成功网址使用kwargs的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆