我目前正在调试 Django 站点的一个奇怪问题,其中一个特定模型在创建新实例或在管理界面中编辑现有实例时触发 404 错误。
具体来说,该错误是在提交表单时发生的。我可以GET
变化形式就好了。
这种情况仅发生在实时站点上并且仅在保存此模型时发生。所有其他模型都按预期运行,当我在本地运行它时,一切都按预期运行。当以编程方式创建时,无论是现场还是本地,一切都很好。
这是我的模型:
class Content(models.Model):
"""Base Content class."""
title = models.CharField(max_length=200)
body = RichTextUploadingField(max_length=30000, blank=True, null=True, config_name='admin')
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
author = models.ForeignKey(to=User, on_delete=models.CASCADE)
slug = models.SlugField(max_length=100, null=True, default=None)
class Meta:
abstract = True
class ContentPage(Content):
"""Represents a page of generic text content."""
title = models.CharField(max_length=200, unique=True)
has_url = models.BooleanField(default=False, help_text='Sets the page to accessible via a URL.')
banner = models.ImageField(upload_to='myfiles/banners/', blank=True, null=True)
def save(self, *args, **kwargs):
"""Create the slug from the title."""
self.slug = slugify(self.title[:100])
super(ContentPage, self).save(*args, **kwargs)
The ContentPage
类是在管理界面中触发问题的类。我的另一个类继承自Content
工作正常。
我已将我的管理设置剥离为以下内容,但它仍然发生:
class CustomAdminSite(AdminSite):
def get_urls(self):
"""Define custom admin URLs."""
urls = super(CustomAdminSite, self).get_urls()
# Append some new views here...
return urls
admin_site = CustomAdminSite()
admin_site.register(ContentPage)
这是重现该问题的基本 URL 配置:
from myapp.admin import admin_site
urlpatterns = [
path('mycooladminsite/', admin_site.urls),
path('', include('myapp.urls')),
]
我检查过的其他一些事情:
- 我没有任何信号干扰保存。
- 我没有在模型中执行任何操作
save()
method.
- 我已经检查过
get_object_or_404()
调用,看不到任何会影响此的内容。
我花了几个小时对此进行了挖掘,但目前我正处于一堵砖墙上。
数据库引擎是mysql.connector.django
,Django 版本为 2.2.11。我还无法为此站点更改引擎或将 Django 更新到 3.x。
这是我之前没有注意到的最近出现的问题。
Update:
我已将问题范围缩小到 ImageField。当我从显示的字段中删除它时,保存时不会出现问题。
我正在使用自定义管理表单,但这似乎不是问题。我尝试过使用默认值,但仍然出现这种情况。我一直在寻找存储类中的异常,但没有找到任何异常。我把它全部剥离了,错误仍然存在。
我检查过本地 302POST
和生产404POST
在 Firefox 开发者工具中,它们实际上是相同的,但生产服务器是 Apache 和x-powered-by
是 Phusion Passenger,而本地服务器是 WSGIServer/0.2 CPython/3.7.3。
我实际上注意到 404 发生在其他multipart/form-data
现在正在制作表格,这是我以前从未得到过的。