Python 重写admin save_模型方法
我使用slugify为我的博客帖子和URL创建slug。为了在slug中也接受非英语字符希腊语,我重写了Post模型的save方法,其中包含一个参数allow_unicode=True。然而,这在管理领域不起作用。每当我试图在管理区设置希腊字符slug时,无论是通过设置一篇带有希腊语标题的新文章,还是通过编辑一篇现有文章的英文slug,管理表单都不允许我保存。为此,正如我在其他线程中发现的那样,我应该重写admin.py文件中的save_model方法。所以我做了,但我犯了一个错误。现在,我得到的错误指出,管理区请求了一篇文章,它的slug将使用旧的url(基于id的url)更改,而不是我在url.py中设置的slug url 当我编辑现有帖子的slug时,我得到的错误要么是/admin/blog/post/1处的属性错误,要么是添加新帖子时/admin/blog/post/add处的属性错误。两种情况下的异常值都是“WSGIRequest”,对象没有属性“save” 我应该如何设置管理员端保存方法以使用slug URL请求URL? 提前谢谢你 models.py: admin.py: URL.py: EDIT2:避免错误的解决方案当然是以正确的方式编写我的超级方法。然而,这并没有给我的代码我想要的功能。所以我的问题的解决方案似乎是,在我的模型中将slug声明为CharField,而不是SlugField。在这种情况下,我甚至可以删除我的save_model方法,这正是我写这篇文章的原因。现在我在检查移除SlugField是否会有任何副作用。如果没有,我应该找到我看到的解决方案的线程,以给予信任,如果有副作用,我应该恢复SlugField,并找到一种方法来覆盖它的validate_slug类。就这些,谢谢你们的回复 EDIT3:没有注意到allow_unicode=True不仅可以作为slugify的参数,也可以作为models的参数。。。这就是我的最终解决方案…当你调用超级方法时,你不应该把self作为一个参数传递给它。因此,与您当前的代码不同:Python 重写admin save_模型方法,python,django,Python,Django,我使用slugify为我的博客帖子和URL创建slug。为了在slug中也接受非英语字符希腊语,我重写了Post模型的save方法,其中包含一个参数allow_unicode=True。然而,这在管理领域不起作用。每当我试图在管理区设置希腊字符slug时,无论是通过设置一篇带有希腊语标题的新文章,还是通过编辑一篇现有文章的英文slug,管理表单都不允许我保存。为此,正如我在其他线程中发现的那样,我应该重写admin.py文件中的save_model方法。所以我做了,但我犯了一个错误。现在,我得到
def save_model(self, request, obj, form, change):
super(PostAdmin, self).save_model(self, request, obj, form)
您应该调用super而不使用self作为参数,并在末尾添加缺少的更改:
def save_model(self, request, obj, form, change):
super(PostAdmin, self).save_model(request, obj, form, change)
加上完整的错误追踪哦,是的,我太傻了。然而,我的代码仍然没有我想要的功能。现在没有任何错误,但管理员表单仍然不允许我保存。我甚至评论了预填充的_字段={'slug':'title',}如果这是原因,但是我得到了一个输入有效“slug”的提示。。。在执行obj.slug=slagifyobj.title之前,请允许\u unicode=True。因此,似乎有另一种方法我应该重写,但我不知道是哪一种。是的,总是这样-在开发过程中总是有另一个问题。然而,通过评论把这些问题变成不相关的问题并不会真的飞起来,所以我建议你把它作为一个新问题来讨论。
from django.urls import path, register_converter, re_path
from .views import (
PostListView,
UserPostListView,
PostDetailView,
PostCreateView,
PostUpdateView,
PostDeleteView,
TagIndexView
)
from django.urls.converters import SlugConverter
class CustomSlugConverter(SlugConverter):
regex = '[-\w]+'
register_converter(CustomSlugConverter, 'custom_slug')
urlpatterns = [
path('front_page', PostListView.as_view(), name='blog-home'),
path('user/<str:username>', UserPostListView.as_view(), name='user-posts'),
re_path(r'post/(?P<slug>[\w-]+)/$', PostDetailView.as_view(), name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
re_path(r'post/(?P<slug>[\w-]+)/update$', PostUpdateView.as_view(), name='post-update'),
re_path(r'post/(?P<slug>[\w-]+)/delete$', PostDeleteView.as_view(), name='post-delete'),
path('tag/<slug>', TagIndexView.as_view(), name='tag-posts'),
]
Traceback (most recent call last):
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 614, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/contrib/admin/sites.py", line 233, in inner
return view(request, *args, **kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1656, in change_view
return self.changeform_view(request, object_id, form_url, extra_context)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1534, in changeform_view
return self._changeform_view(request, object_id, form_url, extra_context)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1580, in _changeform_view
self.save_model(request, new_object, form, not add)
File "/home/george/PythProj/myWebsite/blog/admin.py", line 15, in save_model
super(PostAdmin, self).save_model(self, request, obj, form)
File "/home/george/PythProj/myWebsite/myws_venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1093, in save_model
obj.save()
Exception Type: AttributeError at /admin/blog/post/1/change/
Exception Value: 'WSGIRequest' object has no attribute 'save'
def save_model(self, request, obj, form, change):
super(PostAdmin, self).save_model(self, request, obj, form)
def save_model(self, request, obj, form, change):
super(PostAdmin, self).save_model(request, obj, form, change)