不带pk参数的Django UpdateView

24

是否有可能从与UpdateView相关的URL中删除pk?

例如,如果我有以下内容:

url(r'^myobj/update/(?P<pk>\d+)/$', views.UpdateMyObj.as_view(), name="update")

有没有办法像这样写

url(r'^myobj/update/$', views.UpdateMyObj.as_view(), name="update")

然后将pk作为参数发送到POSTGET请求中?


2
有一个更短的替代方案,请参见此帖子:https://dev59.com/rm025IYBdhLWcg3wKCf- - Staccato
2个回答

57

是的,这是可能的,你只需要重写get_object方法:

from django.views.generic.edit import UpdateView

class UpdateMyObj(UpdateView):
    # .....

    def get_object(self):
        return MyModel.objects.get(pk=self.request.GET.get('pk')) # or request.POST

你有实现的链接吗?谢谢。 - Mike Brian Olivera
5
使用get_object_or_404获取对象是有意义的。 - Mark Mishyn
最佳实践是不要在服务器上使用 request.GET 进行更新。最好始终使用 request.POST - Semmel
@Semmel,request.GET 是指向服务器发出的 get 请求,而不是 OP 用于更新数据库记录的方法。 - Swift

2
有时它会像这样运作。
class MyViewUpdate(UpdateView):
    def get_object(self, queryset=None):
        obj = self.model.objects.get(my_id_or_name_of_field=self.kwargs['pk_or_field_name']) # instead of self.request.GET or self.request.POST
        return obj

2
阴影化关键字很可怕 - 永远不要将 object 用作变量名! - AntonOfTheWoods
感谢澄清。 - AlexKh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接