Django form textarea不会出现在模板中

时间:2015-10-08 03:34:31

标签: python django python-2.7 django-forms django-templates

我是Django的新手,我正在尝试创建一个表单。问题是,当我渲染表单时,文本字段不会出现,但按钮会出现。

该项目是一个类似Twitter的应用程序,表单是用户放置文本然后发布的地方。

forms.py:

from django import forms

class TweetForm(forms.Form):
     text = forms.CharField(widget=forms.Textarea(attrs={'rows': 1, 'cols': 85}), max_length=160)
     country = forms.CharField(widget=forms.HiddenInput())

view.py:

class PostTweet(View):
    def post(self, request, username):
        form = TweetForm(self.request.POST)
        if form.is_valid():
            user = User.objects.get(username=username)
            tweet = Tweet(text=form.cleaned_data['text'], user=user, country=form.cleaned_data['country'])
            tweet.save()
            words = form.cleaned_data['text'].split(" ")
            for word in words:
                if word[0] == "#": #Separamos todas las letras del tweet y si empieza con #, se va a crear un hashtag de esa palabra
                    hashtag, created = HashTag.objects.get_or_create(name=word[1:])
                    hashtag.tweet.add(tweet)
        return HttpResponse('/user/' +username)

model.py:

class HashTag(models.Model):
    #HashTah Model:
    name = models.CharField(max_length=64, unique=True)
    tweet = models.ManyToManyField(Tweet)

    def __unicode__(self):
        return self.name

模板:

{% extends "base.html" %}


{% block content %}

<div class="row clearfix">
    <div class="col-md-12 column">
       <form method="post" action="post/">{% csrf_token %}
            <div class="col-md-8 col-md-offset-2 fieldWrapper">
               {{ form.text.errors }}
               {{ form.text }}
            </div>
           {{ form.country.as_hidden }}
           <div>
               <input type="submit" value="Post">
           </div>
        </form>
    </div>
    <h3>&nbsp;</h3>
    <div>
        {% for tweet in tweets %}
        <div class="well">
            <span>{{ tweet.text }}</span>
        </div>
        {% endfor %}
    </div>
</div>
{% endblock %}

模板图片: enter image description here

2 个答案:

答案 0 :(得分:1)

您必须使用 context_processors 。下面是我对上下文处理器的使用 我的一个网站。

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, "templates")],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            '**newsletter.context_processors.form_signup**'
            ],
        },
    },
]

context_processors.py (这是在我的简报应用程序中)

from .forms import SignUpForm

def form_signup(request):

    context = {'form_signup': SignUpForm()}
    return context

现在, {{form_signup}} 应出现在任何模板上。

答案 1 :(得分:0)

  1. 问题是您没有将表单传递到模板中。您可以通过在视图中继承get_context_data方法来实现。

  2. 使用FormView代替简单View,定义form_classtemplate_name,它会起作用。如果需要,使用postform_valid方法代替form_invalid方法来处理虚假和无效响应。由于您使用的是ModelForm,因此您可以省略所有方法并尽可能简化此视图,只需向其添加success_url属性即可。

  3. 请阅读有关基于类的视图的信息,并深入了解FormView。它会有所帮助:)