使用kwargs的Django成功url

2024-09-21 05:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图修改我的get_success_url,以便如果有任何kwargs被传递给它,我可以使用它们构建返回的url。

到目前为止,我所拥有的是:

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'

我已经打印了kwargs['idnumber'],它会像预期的那样返回pk,但是我似乎看不出我在这方面哪里出错了。

提前谢谢。


Tags: nameselfformidurlgetmodelobject
2条回答

form_valid应该返回一个HttpResponseRedirecthttps://github.com/django/django/blob/master/django/views/generic/edit.py#L57,在您的情况下,您永远不会返回。我不知道您在#save之后是否有任何代码,但是请看一下我在您的代码中所做的注释

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

另外,您不需要手动复制字段,只需这样做(假设没有unique约束,因为如果有,您的版本也会失败):

    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)

在浏览了@Ngenator的答案和其他帖子之后,我得到了下面的工作代码。不过,这可不太好看

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

我在视图中的必要位置有这个self.pknumber = model_b.pk,在其他位置有这个self.pknumber = None,以便使if语句能够生成所需的url。希望这对任何人都有帮助,并随时指出任何错误/改进。

相关问题 更多 >

    热门问题