python - 使用 kwargs 的 Django 成功 url

标签 python django

我正在尝试修改我的 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,))

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

我打印了 kwargs['idnumber'] 并按预期返回了 pk 但是我似乎看不出哪里出了问题。

提前致谢。

最佳答案

form_valid 应该返回一个 HttpResponseRedirect https://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)

关于python - 使用 kwargs 的 Django 成功 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897050/

相关文章:

python - 哪些 Scipy 模块实际上调用了 Numpy 模块?

python - Django ORM 和 PostgreSQL 连接限制

python - 如何在 Django 中获得按相关模型分组的最高值模型?

python - Django - 处理 "enum models"

python - Django 将嵌套模板渲染为 pdf

python - Django-avatar 序数不在范围内(128)

python - Django从get方法获取数据并传递给post方法

python - 从 TensorFlow 的 estimator.DNNClassifier 获取权重

python - PyCharm + Matplotlib?

python - 在定义的条件下使用 pandas value_counts()