gpt4 book ai didi

Django 通用 View UpdateView 重定向 URL 与更新的 slug

转载 作者:行者123 更新时间:2023-12-02 06:59:11 24 4
gpt4 key购买 nike

这是我的 updateview,由带有 slug 字段的 URL 调用,例如

/mymodel/update/<model_name_slug>/

MyModel有两个字段,nameslug 。蛞蝓场<model_name_slug>MyModel.name 自动生成。如果用户更新它,将自动生成一个新的 slug 字段。然后,我想使用新生成的 slug 字段重定向到这个新 URL。

段塞场自动生成正在运行。它在 MyModelEditForm 中实现。但是,下面的代码将不起作用。原因是:

1) 用户输入此 URL 来更新现有模型

/mymodel/update/example-model

2) 用户将名称属性更改为 "example model changed" 。然后slug字段将生成为"example-model-changed"MyModel .

3) 但 URL 没有重定向到 "/mymodel/update/example-model-changed" ,如get_object()将返回None. get()将无法比较新生成的 URL "example-model-changed"与原版"example-model"

下面的代码中我缺少什么?我尝试使用 self.object 访问新更新的对象,但出现以下错误:

 MyModelUpdateView object has no attribute 'object'

这是代码片段:

class MyModelUpdateView(LoginRequiredMixin, UpdateView):
model = MyModel
form_class = MyModelUpdateForm
template_name = 'mymodel/update_mymodel.html'

def get_success_url(self):
view_name = 'update_mymodel'
return reverse_lazy(view_name, kwargs={'model_name_slug': self.kwargs.get('model_name_slug','')})

def get_form_kwargs(self):
'''
This injects form with keyword arguments.
'''
kwargs = super(MyModelUpdateView, self).get_form_kwargs()
#Update the kwargs with the user_id
kwargs['user'] = self.request.user
return kwargs

def get(self, request, *args, **kwargs):
# self.object = self.get_object()
if self.request.path != self.object.get_absolute_url():
return HttpResponseRedirect(self.object.get_absolute_url())
else:
return super(MyModelUpdateView, self).get(request,*args, **kwargs)
# context = self.get_context_data(object=self.object)
# return self.render_to_response(context)

def get_object(self, queryset=None):
instance = MyModel.objects.get(slug=self.kwargs.get('model_name_slug',''))
return instance

即使 get_success_url() 已正确更新, get_object() 似乎也有两个相互冲突的要求:1) 能够使用现有的“example-model”slug 字段获取正确的对象;2) 能够在现有 URL 未重定向之前使用新生成的“example-model-changed”获取更新的对象。

最佳答案

您不必在 get_success_url 方法中使用 self.get_objectform_valid()保存表单时设置 self.object,因此您可以使用 self.object.slug 获取新的 url。

def get_success_url(self):
view_name = 'update_mymodel'
# No need for reverse_lazy here, because it's called inside the method
return reverse(view_name, kwargs={'model_name_slug': self.object.slug})

关于Django 通用 View UpdateView 重定向 URL 与更新的 slug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33115530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com