在给定模型的wagtail modeladmin上,我需要修改Create_Button,以便它显示带有模型字段子集的创建视图,并向外部服务添加API调用。
覆盖编辑按钮我可以无缝地做到这一点,只需绑定属性
#wagtail_hooks.py
class MyModelAdmin(Modeladmin):
model = MyModel
...
edit_view_class = MyModelEditView
...
在MyModelEditView(EditView(上,刚刚在form_valid方法上添加了我的扩展逻辑。
按照相同的模式,我创建了一个MyModelCreateView(CreateView(,将属性添加到MyModelAdmin中为:create_view_class=MyModelCreateView
其定义如下:
#wagtail_hooks.py
class MyModelCreateView(CreateView):
"""
we only want user to define 2 fields of the model, then call an API REST
that returns the other fields, then save object to backend db
"""
panels = [
FieldPanel('field1'),
FieldPanel('field2')
]
def get_edit_handler(self):
panels = self.panels
edit_handler = ObjectList(panels).bind_to(model=MyModel, request=self.request)
return edit_handler
def create_mymodel(self, form):
data = form.cleaned_data
for field in data:
data[field] = cleanup(field)
res = requests.post(...)
if res.status_code == 200:
logger.info("created mymodel")
...
else:
logger.error(f"something went wrong: {res.status_code}n{res.content}")
...
return True
def form_valid(self, form, *args, **kwargs):
res = self.create_mymodel(form)
try:
self.form_valid(form, *args, **kwargs)
except Exception:
print(Exception)
form_valid_return = super().form_valid(form, *args, **kwargs)
return form_valid_return
一旦定义了这一点,我就应该覆盖哪些modeladmin类方法来满足我们的需求:get_context_data、dispatch、form_valid
只是python manage.py runserver的问题,导航到admin/mymodel路径,然后崩溃:
.venv/lib/python3.6/site-packages/django/urls/resolvers.py", line 676, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'mymodel_modeladmin_edit' with arguments '('',)' not found. 1 pattern(s) tried: ['admin/mymodel/edit/(?P<instance_pk>[-\w]+)/$']
[15/Jul/2020 15:08:08] "GET /admin/mymodel/ HTTP/1.1" 500 798083
所以你会想,好吧,我做错了什么,评论最后一段代码,放一个ipdb跟踪。。。而NoReverseMatch的问题仍然存在,没有办法解决这个问题。
清理浏览器缓存,切换到另一个浏览器,重新运行runserver,重新创建数据库,没有什么能让这个问题恢复稳定。
最终,您切换git分支,重新运行git克隆,重新安装virtualenv,删除后端数据库,然后您的项目有了一个新的本地实现,直到我再次尝试解决这个问题。
所以我的问题是,到底发生了什么?这个缓存的路由在哪里?我和姜戈共事多年,从未遇到过这样的行为。
您是否尝试在应用程序中查找URL:试试这个命令
./manage.py show_urls | grep /create/
你看到任何创建视图的实例pk了吗?