url中没有pk的Django UpdateView
Posted
技术标签:
【中文标题】url中没有pk的Django UpdateView【英文标题】:Django UpdateView without pk in url 【发布时间】:2013-07-07 20:34:21 【问题描述】:是否可以从与UpdateView
相关的网址中删除pk
?
例如,如果我有
url(r'^myobj/update/(?P<pk>\d+)/$', views.UpdateMyObj.as_view(), name="update")
有什么办法可以这样写
url(r'^myobj/update/$', views.UpdateMyObj.as_view(), name="update")
然后在POST
或GET
请求中将pk
作为参数发送?
【问题讨论】:
有关此答案的更简短替代方法,请参阅此帖子:***.com/questions/6181041/… 【参考方案1】:是的,您可能只需要覆盖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
【讨论】:
你有实现的链接吗?谢谢 使用get_object_or_404获取对象是有意义的 最佳实践是不要在服务器上使用request.GET
进行更新。最好始终使用request.POST
。
@Semmel request.GET
指的是向服务器发出的 get
请求。不是 OP 用来更新数据库记录的方法。【参考方案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
【讨论】:
隐藏关键字是可怕的 - 永远不要使用object
作为变量名!
感谢您的澄清以上是关于url中没有pk的Django UpdateView的主要内容,如果未能解决你的问题,请参考以下文章
如何使用当前登录用户作为 Django DetailView 的 PK?
没有 PK 的 Django REST Framework 嵌套路由
在 Django 中,我如何编写一个 url.py,其中 users/self/ 与 users/<pk>/ 相同,其中 <pk> 是您登录的用户 pk?