【问题标题】:Django UpdateView pk via POST argumentsDjango UpdateView pk 通过 POST 参数
【发布时间】:2017-08-03 23:43:46
【问题描述】:

我正在 django v1.10 上开发应用,我想通过 POSTpk 传递给 UpdateView (CBV) > 出于安全原因的参数,因为该应用程序使用身份验证系统。

我研究并发现覆盖 get_object 方法我(应该)得到我想要的,但没有任何反应。 (Django UpdateView without pk in url)

我不知道是我做错了什么还是错过了什么。也许这种情况需要不同的方法。

在我的模板链接来源(不是 UpdateView 模板)中,我通过表单中的链接传递参数,calification.id 是 pk。

<form method="post" action="{% url 'edu:calification-update' %}">
{% csrf_token %}
<input type="hidden" value="{{ calification.id }}" name="pk">
<button class="btn btn-default btn-xs" type="submit">editar</button>
</form>

在接收视图中,我重写了 get_object 方法:

class CalificationUpdateView(UpdateView):
    model = Calification
    template_name = 'edu/calification_create.html'
    form_class = CalificationForm

    def get_object(self):
        obj = get_object_or_404(Calification, pk=self.request.POST.get('pk'))
        return obj

在我的模型表单中:

class CalificationForm(ModelForm):
    class Meta:
        model = Calification
        fields = '__all__'

在我的 edu/calification_create.html

<form method="post" class="form-horizontal">
    {% csrf_token %}
    {{ form }}
    <input type="submit" class="btn btn-success snps-btn-save form-control" value="Guardar" />
</form>

但在更新视图中没有检索到对象,表单为空白,没有出现错误。

我检查了POST参数传递OK,模板对象没有问题,calification.id声明正常,就像get_object方法没有检索实例。

谢谢

【问题讨论】:

  • 如果在get_object方法中打印self.request.POST.get('pk')会得到什么。
  • @Alasdair 我得到了 pk 的值(即 1)。
  • 您的get_object 方法看起来还可以。目前还不清楚问题是什么。为什么要使用创建模板edu/calification_create.html 进行更新视图。
  • edu/calification_create.html 有一个标准的 django 模板代码表单。
    {% csrf_token %} {{ form }}

标签: django django-views


【解决方案1】:

要更新的对象的默认模板上下文名称是object。如果您使用其他内容,则需要使用context_object_name 指定它。

【讨论】:

  • 对不起@Tomas Walch,我不明白你的回答。据我研究,在 CBV 中要使用 pk 以外的其他参数检索所需的实例,您必须覆盖 get_object。 docs.djangoproject.com/en/1.10/ref/class-based-views/… "返回此视图将显示的单个对象。"
  • 据我所知,这不是你的问题。您的问题是您在模板中引用了calification。没有这个变量,从get_object返回的对象默认叫object
  • 现在我明白你的答案了。它不是模板对象的问题,它被重命名。我编辑了问题以澄清参数 pk 已呈现并通过 OK。我尝试了同样的事情,但使用了 GET,结果是一样的,没有找到对象。
  • 在您展示的代码示例中,您没有在任何地方设置calification 的值。只是说。
  • 您的get_object 没有任何问题。由于您没有收到 404,因此您的错误在于您如何引用模板中的对象。如果这是整个视图类。
【解决方案2】:

您必须修改“get_object”方法,通过替换以下行来捕获您传递的参数的值:

pk = self.kwargs.get (self.pk_url_kwarg)

作者:

if self.request.method == 'POST':
        form = YourForm(request.POST, request.FILES)
        if form.is_valid ():
            pk = form.pk

这对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多