我正在尝试构建一个表单,将名称和电子邮件地址保存到我的数据库中。然而,它并不能拯救。。。我使用了包含标记,因为我想在不同的模板中使用相同的表单。这是我的型号.py:
class Contact(models.Model):
FRAU = 'FR'
HERR= 'HR'
GENDER_CHOICES = (
(FRAU, 'Frau'),
(HERR, 'Herr'),
)
gender = models.CharField(max_length=2, choices=GENDER_CHOICES, default=FRAU)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=200)
email = models.EmailField()
def __unicode__(self):
return "%s %s" %(self.first_name, self.last_name)
这是我的表格.py:
class FragenContactForm(ModelForm):
class Meta:
model = Contact
fields = ['gender', 'first_name', 'last_name', 'email']
这是我的自定义标签模块:
from django import template
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from fragen.forms import FragenContactForm
register = template.Library()
@register.inclusion_tag('fragen/askforoffer.html', takes_context=True)
def askforoffer(context):
form = FragenContactForm(context['request'].POST or None)
if context['request'].method=='POST':
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('fragen/thanks.html'))
else:
messages.error(context['request'], "Error")
return {'form': FragenContactForm()}
在我填写并提交表格后,我在数据库中什么也看不到。我是不是错过了什么?谢谢
我使用了包含标记,因为我想在中使用相同的形式不同的模板。
您可以简单地重用该表单,或者由于本例中的表单非常简单,您可以使用CreateView
基于类的通用视图,从而进一步减少代码。
您的视图将只包含以下内容:
class OfferForm(CreateView):
template_name = 'fragen/askforoffer.html'
model = Contact
fields = ['gender', 'first_name', 'last_name', 'email']
success_url = 'fragen/thanks.html'
Django将自动创建ModelForm
,并为您处理错误重定向和字段保存。
在你的fragen/askforoffer.html
模板中,你只需要这个:
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create" />
</form>
最后,在您的urls.py
:中
url(r'^submit-offer/$', OfferForm.as_view(), name='offer-form')
要在多个位置显示相同的表单,只需将其映射到URL:
url(r'^another-form/$', OfferForm.as_view(), name='another-form')
最后,__unicode__
方法应该返回一个unicode对象;所以在你的模型中:
def __unicode__(self):
return u"{} {}".format(self.first_name, self.last_name)
您尝试的方法将不起作用,因为模板标记代码将在模板呈现之前执行;因此,当用户看到表单时,您的标记代码已经完成。没有办法再次"触发"它;这就是为什么您需要一种传统的视图方法来接受输入到表单中的数据。
Post
是一种由视图处理的服务器请求方法。
Inclusion标记与页面一起呈现(即在服务器响应期间)。因此,如果您不故意将POST作为上下文变量发送到页面(但它不会被请求。POST-只是some_variable),那么页面上下文就无法获得request.POST
。看起来有点奇怪。。
您必须在视图函数中处理表单处理。
from django.shortcuts import redirect, render
from fragen.forms import FragenContactForm
def askforoffer(request):
form = FragenContactForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('specify_thank_url_here')
return render(request, 'fragen/askforoffer.html',
{ 'form': form })
我从未见过包含标签中的任何表单处理,我怀疑这是否有效。上图功能可以为您指明正确的方向。