0

在给定模型的 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 clone,重新安装 virtualenv,删除后端数据库,然后你有一个新的本地项目实现,直到我再次尝试解决这个问题。

所以我的问题是,到底发生了什么?这个缓存的路由在哪里?我和 django 一起工作了很多年,从来没有遇到过这样的行为。

4

1 回答 1

0

您是否尝试在应用程序中查找 url:试试这个命令

./manage.py show_urls | grep /create/

您是否看到任何带有创建视图的实例 pk?

于 2020-07-16T14:13:40.373 回答