这可能是我作为开发人员在短时间内遇到过的最奇怪的错误。我有一个在我的本地机器上完美呈现的表单,但完全相同的代码无法在服务器上呈现。
我有一个表格,看起来像这样:
没什么好看的,只有几个输入字段和一个提交按钮。
我是如何创建它的?首先,有一种形式:
from django import forms
from django.forms.extras.widgets import SelectDateWidget
from blog.models import BlogPost
EMPTY_FIELD_ERROR = "You cannot submit a blog post with no %s"
class DateInput(forms.DateInput):
input_type = 'date'
class PlainTextarea(forms.Textarea):
def build_attrs(self, extra_attrs=None, **kwargs):
attrs = super(PlainTextarea, self).build_attrs(extra_attrs, **kwargs)
if "cols" in attrs: del attrs["cols"]
if "rows" in attrs: del attrs["rows"]
return attrs
class BlogPostForm(forms.models.ModelForm):
class Meta:
model = BlogPost
fields = ("title", "date", "body", "visible")
widgets = {
"title": forms.fields.TextInput(attrs={
"class": "pure-u-1-1 pure-u-md-19-24"
}),
"date": DateInput(),
"body": PlainTextarea(attrs={
"class": "pure-u-1-1 pure-u-md-19-24"
}),
"visible": forms.CheckboxInput(attrs={
"class": "pure-u-1-24"
})
}
error_messages = {
"title": {"required": EMPTY_FIELD_ERROR % "title"},
"date": {"required": EMPTY_FIELD_ERROR % "date"},
"body": {"required": EMPTY_FIELD_ERROR % "body"}
}
在new_post视图中,如果它检测到请求是GET请求,我只需创建此表单的实例,并将其传递给new_post模板:
def new_post_page(request):
if request.method == "POST":
form = BlogPostForm(request.POST)
if form.is_valid():
BlogPost.objects.create(
title=request.POST["title"].strip(),
date=datetime.datetime.strptime(
request.POST["date"], "%Y-%m-%d"
).date(),
body=request.POST["body"].strip(),
visible=request.POST.get("visible") is not None
)
return redirect("/")
else:
return render(request, "new_post.html", {"form": form})
form = BlogPostForm()
return render(request, "new_post.html", {"form": form})
这是模板的一部分:
<form method="POST" class="pure-form pure-form-aligned">
<div class="pure-g">
<div class="pure-u-1-1 formrow">
<label for="{{ form.title.id_for_label }}" class="pure-u-1-1 pure-u-md-4-24">Title:</label>
{{ form.title }}
{% if form.title.errors %}
<div class="error">
{{ form.title.errors }}
</div>
{% endif %}
</div>
<div class="pure-u-1-1 formrow">
<label for="{{ form.date.id_for_label }}" class="pure-u-1-1 pure-u-md-4-24">Date:</label>
{{ form.date }}
{% if form.date.errors %}
<div class="error">
{{ form.date.errors }}
</div>
{% endif %}
</div>
这一切都可以在我自己的机器上运行(MacBook,El Capitain,Python3,Django 1.8.4),但是当我将代码部署到服务器时,我得到了这个:
检查HTML显示{{form.title}}标记未呈现。但一切都是一样的!好吧一切都好。显然,服务器上的某些设置是不同的,例如Debug被设置为False。我还在服务器上使用postgres数据库,在本地使用SQLite数据库。
为了让事情变得更加疯狂,我进行了单元测试,包括new_page视图渲染表单的测试 - 并且它们在服务器上传递!我甚至在服务器上启动了一个Django shell,手动将请求传递给new_page视图,打印HTML,,输入HTML就在那里!
可能有用的一些信息:
请帮助这个Django新手?
更新
我尝试使用django testserver代替gunicorn,并且正确地呈现了表单,所以这可能是gunicorn的问题?
答案 0 :(得分:2)
如果另一个可怜的灵魂在这里结束。检查您的软件包(pip freeze)在本地和服务器上是否相同。我在本地有django-filter == 0.15.0,在服务器上有django-filter == 0.10.0导致这个问题没有引起错误。
答案 1 :(得分:1)
所以,我已经解决了这个问题。不幸的是,我不确定如何。
正如我在更新中所提到的,关闭gunicorn并使用django测试服务器来修复问题。我关闭了测试服务器并再次启动了炮弹,并且......表格仍然正确呈现。
我怀疑是重启枪炮就是我需要的。我不知道为什么,或者如果那肯定是什么修复它。哦,好吧。
答案 2 :(得分:0)
当我将django项目部署到AWS EC2时,我遇到了同样的问题。
如果您已经关注过Nginx gunicorn和Django教程,那么您最好的选择是重新启动EC2,然后重新启动gunicorn服务器。这解决了我的问题。
答案 3 :(得分:0)
每次部署时都应该重新启动Web服务器 - 这将确保您运行应用程序的最新代码。这是非常具有欺骗性的,因为它会正确地提取html模板,但不会运行为模板呈现内容的代码(这就是为什么你看到你的标签是硬编码但不是动态渲染的文本输入)。 / p>
我在Ubuntu上使用Apache,当我整晚都在调试时,这会让我每隔一段时间......在部署新代码时总是重新启动服务器:
sudo service apache2 restart