我是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> </h3>
<div>
{% for tweet in tweets %}
<div class="well">
<span>{{ tweet.text }}</span>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
答案 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)
问题是您没有将表单传递到模板中。您可以通过在视图中继承get_context_data
方法来实现。
使用FormView
代替简单View
,定义form_class
和template_name
,它会起作用。如果需要,使用post
和form_valid
方法代替form_invalid
方法来处理虚假和无效响应。由于您使用的是ModelForm
,因此您可以省略所有方法并尽可能简化此视图,只需向其添加success_url
属性即可。
请阅读有关基于类的视图的信息,并深入了解FormView。它会有所帮助:)