【问题标题】:Django success url using kwargs使用 kwargs 的 Django 成功 url
【发布时间】:2015-01-09 21:36:03
【问题描述】:

我正在尝试修改我的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,但是我似乎看不出我哪里出了问题。

提前致谢。

【问题讨论】:

  • get_success_url 不会在 Django 的通用视图中使用关键字参数调用。
  • @simeon 所以我什么都不能传递给它?最终结果只是能够重定向到一个新创建的 pk,如果它是由视图创建的。
  • 你从哪里得到idnumber?当你将它传递给get_success_url 时,你必须以某种方式获取它,那么视图是如何知道它的呢?
  • @ngenator 使用 self.get_success_url(idnumber = model_b.pk) 从视图中的 else 传递时获取它
  • 您可以添加该视图代码的其余部分吗?

标签: python django


【解决方案1】:

form_valid 应该返回一个 HttpResponseRedirect https://github.com/django/django/blob/master/django/views/generic/edit.py#L57 在你的情况下,你永远不会这样做。不知道#save后面有没有代码,看一下我在你的代码里做的cmets

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)

【讨论】:

  • 您好,感谢您的回答。恐怕仍然对“idnumber”给出相同的错误。今天早上尝试了其他解决方案,但仍然没有乐趣。
【解决方案2】:

在玩了@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.pkself.pknumber = None 否则在哪里启用if 语句来构建所需的url。希望这可以帮助任何人,并随时指出任何错误/改进。

【讨论】:

  • 抱歉,我正要回答并建议你做类似的事情,或者从 **kwargs 更改为实际的关键字参数。
  • 另外,你真的应该使用if self.pknumber is not None
【解决方案3】:

https://ccbv.co.uk/projects/Django/4.0/django.views.generic.edit/UpdateView/

您不能在get_success_url(self) 方法中传递参数。只能参考self参数。例如self.kwargs['pk']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2017-12-19
    • 1970-01-01
    • 2017-11-11
    • 2011-07-12
    相关资源
    最近更新 更多