【问题标题】:Django form textarea doesn't appear in templateDjango 表单 textarea 没有出现在模板中
【发布时间】:2016-01-05 12:10:54
【问题描述】:

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

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

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)

模型.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

【问题讨论】:

  • 显示获取方法代码

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


【解决方案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 }} 应该出现在任何模板上。

【讨论】:

    【解决方案2】:
    1. 问题在于您没有将表单传递到模板中。您可以通过在您的视图中继承 get_context_data 方法来做到这一点。

    2. 使用FormView而不是简单的View,定义form_classtemplate_name,就可以了。如果需要,请使用 form_validform_invalid 方法代替 post 方法来处理有效和无效响应。由于您使用的是ModelForm,因此您可以省略所有方法并保持此视图尽可能简单,只需为其添加success_url 属性即可。

    请阅读有关 ClassBased 视图的信息,并深入研究 FormView。这会有所帮助:)

    【讨论】:

      【解决方案3】:

      尝试添加类,表单类,

      class PostTweet(View):
          form_class = TweetForm
      
          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)
      

      【讨论】:

        猜你喜欢
        • 2019-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 2015-12-26
        • 2020-02-05
        • 2016-12-06
        • 2016-05-16
        相关资源
        最近更新 更多