Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写admin save_模型方法_Python_Django - Fatal编程技术网

Python 重写admin save_模型方法

Python 重写admin save_模型方法,python,django,Python,Django,我使用slugify为我的博客帖子和URL创建slug。为了在slug中也接受非英语字符希腊语,我重写了Post模型的save方法,其中包含一个参数allow_unicode=True。然而,这在管理领域不起作用。每当我试图在管理区设置希腊字符slug时,无论是通过设置一篇带有希腊语标题的新文章,还是通过编辑一篇现有文章的英文slug,管理表单都不允许我保存。为此,正如我在其他线程中发现的那样,我应该重写admin.py文件中的save_model方法。所以我做了,但我犯了一个错误。现在,我得到

我使用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作为一个参数传递给它。因此,与您当前的代码不同:

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)