我目前正在调试一个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)
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()
方法中没有执行任何操作。 - 已检查
get_object_or_404()
调用,未发现会影响此问题的内容。
我花费了几个小时的时间研究这个问题,但目前还没有头绪。
数据库引擎使用的是mysql.connector.django
,Django版本为2.2.11。但由于该网站,我无法更改引擎或升级至3.x版本。
这是一个最近才出现的问题,以前从未注意到。
更新:
我将问题缩小到了ImageField
。当我将其从显示字段中移除时,保存就不会出现问题了。
我正在使用一个自定义管理表单,但这似乎不是问题所在。我尝试使用默认选项,但仍然出现问题。我一直在寻找存储类中的异常,但没有找到。我将其全部剥离,但错误仍然存在。
我在Firefox开发人员工具中检查了本地302 POST
和生产404 POST
,它们几乎相同,但生产服务器是Apache且x-powered-by
为Phusion Passenger,而本地服务器是WSGIServer/0.2 CPython/3.7.3。
我实际上注意到在生产环境中会出现其他multipart/form-data
表单的404错误,而之前从未遇到过。