这是我的更新视图,由带有slug字段的URL调用,例如
/mymodel/update/<model_name_slug>/
MyModel
有两个字段name
和slug
。段塞字段<model_name_slug>
是从MyModel.name
自动生成的。如果用户更新它,将自动生成一个新的段塞字段。然后,我想用新生成的段塞字段重定向到这个新URL。
slug字段自动生成正在运行。它在MyModelEditForm
中实现。但是,下面的代码不起作用。原因是:
1)用户输入此URL以更新现有模型
/mymodel/update/example-model
2)用户将Name属性更改为"example model changed"
。然后,slug字段将在"example-model-changed"
中生成为MyModel
。
3)但是网址未重定向到"/mymodel/update/example-model-changed"
,因为get_object()
将返回None. get()
将无法将新生成的网址"example-model-changed"
与原始{ {1}}
我在下面的代码中缺少什么?我尝试使用"example-model"
访问新的更新对象,但有以下错误:
self.object
以下是代码段:
MyModelUpdateView object has no attribute 'object'
即使正确更新了get_success_url(),get_object()似乎也有两个相互矛盾的要求: 1)能够使用现有的“example-model”slug字段获取正确的对象; 2)能够在未重定向现有URL之前使用新生成的“example-model-changed”获取更新的对象。
答案 0 :(得分:4)
您不必在self.get_object
方法中使用get_success_url
。保存表单时form_valid()
设置self.object
,因此您可以使用self.object.slug
获取新网址。
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})
答案 1 :(得分:0)
没有太多使用基于类的视图,但是..
Main.hs:198:3:
Couldn't match expected type ‘(Maybe Text -> f (Maybe Text))
-> Instance -> f Instance’
with actual type ‘Maybe Text’
Relevant bindings include
instPublicIP' :: (Maybe Text -> f (Maybe Text))
-> Instance -> f Instance
(bound at app/Main.hs:197:1)
In the expression:
insNetworkInterfaces
^? ix 0 . iniAssociation . _Just . iniaPublicIP . _Just
In an equation for ‘instPublicIP'’:
instPublicIP'
= insNetworkInterfaces
^? ix 0 . iniAssociation . _Just . iniaPublicIP . _Just
Main.hs:198:27:
Couldn't match type ‘InstanceNetworkInterface’
with ‘Instance -> f0 Instance’
Expected type: (InstanceNetworkInterface
-> Const (Data.Monoid.First Text) InstanceNetworkInterface)
-> (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
-> Instance -> f0 Instance)
-> Const
(Data.Monoid.First Text)
(([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
-> Instance -> f0 Instance)
Actual type: (IxValue
(([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
-> Instance -> f0 Instance)
-> Const
(Data.Monoid.First Text)
(IxValue
(([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
-> Instance -> f0 Instance)))
-> (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
-> Instance -> f0 Instance)
-> Const
(Data.Monoid.First Text)
(([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
-> Instance -> f0 Instance)
In the first argument of ‘(.)’, namely ‘ix 0’
In the second argument of ‘(^?)’, namely
‘ix 0 . iniAssociation . _Just . iniaPublicIP . _Just’
如果get_success_url应该返回你要将用户重定向到的url,那么你不应该使用更新的slug而不是旧的slug吗?
def get_success_url(self):
view_name = 'update_mymodel'
return reverse_lazy(view_name, kwargs={'model_name_slug': self.kwargs.get('model_name_slug','')})
我想这是正确完成的。
1)能够使用现有的“example-model”获取正确的对象 slu field field;
您希望根据更新的重定向模型获取更新的网址。你在哪里创建更新的网址? get_success_url?那我不明白为什么self.get_object().model_name_slug
不起作用?
2)能够使用新生成的方式获取更新的对象 在未重定向现有URL之前,“example-model-changed”。
答案 2 :(得分:0)
感谢Alasdair和eugene的快速帮助。
与此同时,我已经想出了另一种方法!也就是说,在URL中使用两个参数,例如和。
在stackoverflow URL中查找。你有没有发现类似的东西?是的,就是这样。我想是33115530是pk。其余的是自动生成的slug字段!
然后,在get_object中,将通过get_success_url获取新更新的对象,并且get_success_url可以使用对象中更新的新slug字段。