我试图用Django显示一个简单的表单输入文本框。我正在Amazon AWS上部署。该站点在不同的服务器(pythonanywhere)上运行良好,但AWS上存在一个主要问题。具体来说,没有显示输入框。我使用模板如下:
home.html的
{% extends 'lists/base.html' %}
{% block header_text %}Start a new To-Do list {% endblock %}
{% block form_action %}{% url 'new_list' %}{% endblock %}
base.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X UA-Compatible" content="IE-edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>To-Do lists</title>
<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/static/base.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3 jumbotron">
<div class="text-center">
<h1>{% block header_text %}{% endblock %}</h1>
<form method="POST" action="{% block form_action %}{% endblock %}">
{{ form.text }}
{% csrf_token %}
{% if form.errors %}
<div class = "form-group has-error">
<span class = "help-block">{{ form.text.errors }}</span>
</div>
{% endif %}
</form>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6 col-md-offset-3">
{% block table %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
models.py
from django.db import models
from django
.core.urlresolvers import reverse
class List(models.Model):
def get_absolute_url(self):
return reverse('view_list', args=[self.id])
# Create your models here.
class Item(models.Model):
text = models.TextField(default = '')
list = models.ForeignKey(List, default = None)
#list = models.ForeignKey(List , default=None)
forms.py
from django import forms
from lists.models import Item
EMPTY_ITEM_ERROR = "You can't have an empty list item"
class ItemForm(forms.models.ModelForm):
class Meta:
model = Item
fields = ('text',)
widgets ={
'text' : forms.fields.TextInput(attrs={
'placeholder': 'Enter a to-do item',
'class': 'form-control input-lg',
}),
}
error_messages = {
'text' : { 'required': EMPTY_ITEM_ERROR }
}
views.py
from django.shortcuts import redirect, render
from lists.models import Item, List
from django.core.exceptions import ValidationError
from lists.forms import ItemForm
from lists.models import Item, List
# Create your views here.
def home_page(request):
return render(request, 'lists/home.html', {'form': ItemForm()})
urls.py
from django.conf.urls import url
from lists import views
urlpatterns = [
url(r'^new$', views.new_list, name='new_list'),
url(r'^(\d+)/$', views.view_list, name='view_list'),
]
目前该网站显示以下内容:
我已将整个项目推送/拉到github,每个站点之间的代码是相同的,但我还没看到为什么文本输入没有显示,除非表单需要是以某种方式在Django中初始化或者是对AWS的怪癖?
比较两个站点时,没有文本框的站点不会生成以下内容:
<input class="form-control input-lg" id="id_text" name="text" placeholder="Enter a to-do item" type="text" />
即使它应该是 base.html 语法。
更新
完整的 views.py (根据建议的评论):
from django.shortcuts import redirect, render
from lists.models import Item, List
from django.core.exceptions import ValidationError
from lists.forms import ItemForm
from lists.models import Item, List
# Create your views here.
def home_page(request):
return render(request, 'lists/home.html', {'form': ItemForm()})
def new_list(request):
form = ItemForm(data=request.POST)
if form.is_valid():
list_ = List.objects.create()
Item.objects.create(text=request.POST['text'], list=list_)
return redirect(list_)
else:
return render(request, 'lists/home.html', {"form": form})
def view_list(request, list_id):
list_ = List.objects.get(id=list_id)
form = ItemForm()
if request.method == 'POST':
form = ItemForm(data=request.POST)
if form.is_valid():
Item.objects.create(text=request.POST['text'], list=list_)
return redirect(list_)
return render(request, 'lists/list.html', {'list': list_, "form": form})
答案 0 :(得分:3)
根据我对Django的经验,你经常(总是?)需要做两件事来让静态文件进入&#34;刷新&#34;将它们推送到远程服务器之后:
./manage.py collectstatic
以确保所有静态文件都在正确的位置。ssh
进入您的服务器时,运行命令sudo reboot now
以重新启动您的服务器(请注意,这会让您退出ssh会话,并且您的服务器暂时无法访问 - 通常只是在我的情况下几秒钟。)至于步骤 2 ,可能有更好的方法来执行此操作,但根据我的经验,当我更新静态文件时,在我执行此操作之前不会提供更新的版本,并重新启动{{1等等不足以使更改生效。请注意,这意味着您的站点(如果有的话)在服务器重新启动时将无法访问几秒钟(这让我觉得可能有更好的方法)但对我和我的小用户群而言这不是一个大问题。
从阅读其他一些关于静态文件未更新的帖子来看,似乎也可能是您的浏览器缓存静态文件,重新启动浏览器/清除缓存也可能会起到作用,但我还没有机会尝试这个。