表单输入框不显示

时间:2016-08-23 19:57:42

标签: python django forms amazon-web-services input

我试图用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'),

        ]

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

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})

1 个答案:

答案 0 :(得分:3)

根据我对Django的经验,你经常(总是?)需要做两件事来让静态文件进入&#34;刷新&#34;将它们推送到远程服务器之后:

  1. 运行./manage.py collectstatic以确保所有静态文件都在正确的位置。
  2. ssh进入您的服务器时,运行命令sudo reboot now以重新启动您的服务器(请注意,这会让您退出ssh会话,并且您的服务器暂时无法访问 - 通常只是在我的情况下几秒钟。)
  3. 至于步骤 2 ,可能有更好的方法来执行此操作,但根据我的经验,当我更新静态文件时,在我执行此操作之前不会提供更新的版本,并重新启动{{1等等不足以使更改生效。请注意,这意味着您的站点(如果有的话)在服务器重新启动时将无法访问几秒钟(这让我觉得可能有更好的方法)但对我和我的小用户群而言这不是一个大问题。

    从阅读其他一些关于静态文件未更新的帖子来看,似乎也可能是您的浏览器缓存静态文件,重新启动浏览器/清除缓存也可能会起到作用,但我还没有机会尝试这个。