Django UpdateView pk通过POST参数

时间:2017-03-13 20:02:54

标签: django django-views

我正在开发django v1.10上的应用程序,我想通过 POST pk 传递给 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

在我的ModelForm中:

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参数传递好了,模板对象没有问题, calification.id 被宣告正常,就像 get_object 方法没有检索实例。

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您必须修改“ 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

这对我有用