2016-08-23 81 views
3

我试图用Django显示一个简单的表单输入框。我正在部署在亚马逊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'), 

     ] 

目前该网站显示以下内容:

enter image description here

但是应该(而且确实在不同的网站)显示此:enter image description here

我推/拉整个项目的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

您是否尝试过运行'./manage.py collectstatic'?这是我在模板问题时尝试的第一件事,特别是在服务器上。 – elethan

+0

'home_page'视图没有在您发布的URL定义中的任何地方使用...? – solarissmoke

+0

@elethan - 是的,我运行了collectstatic感谢。我能够看到模板的变化,并收集静态看到它们影响页面,但表单更新没有运气。我注意到,在pythonanywhere中,当我对forms.py进行更改时,我必须在该网站上运行“重新加载”功能,我认为这可能会重新加载服务器并查看窗体更改的影响?因为如果我没有这个改变就改变了forms.py,我也没有看到那里的改变。 – Jeeves

回答

3

在我与Django的经历,有两件事情你经常(总是?)需要在将它们推送到远程服务器后,请将静态文件“刷新”:

  1. 运行./manage.py collectstatic确保你所有的静态文件都在正确的位置。
  2. 虽然ssh编辑到您的服务器运行命令sudo reboot now重新启动您的服务器(请注意,这会踢你走出你的SSH会话,你的服务器将无法访问片刻 - 通常只有几秒钟在我的情况下)。

至于步有可能是一个更好的方式来做到这一点,但我的经验,当我更新的静态文件的更新版本不提供,直到我做到这一点,并重新启动nginx或类似物不足以使更改生效。请注意,这意味着您的网站如果处于活动状态,在服务器重新启动后几秒钟内将无法访问(这使我认为可能有更好的方法),但对于我和我的小用户群这不是一个大问题。

从阅读关于静态文件不更新的一些其他帖子,它似乎也可能是您的浏览器正在缓存静态文件,并重新启动浏览器/清除缓存也可能伎俩,但我还没有机会尝试这个。