0

我正在尝试构建一个表单来将姓名和电子邮件地址保存到我的数据库中。但是,它不会保存...我使用了包含标记,因为我想在不同的模板中使用相同的表单。这是我的models.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)

这是我的forms.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()}

填写并提交表格后,我的数据库中什么也看不到。我错过了什么吗?谢谢!

4

3 回答 3

0

Post是一种由视图处理的服务器请求方法。

包含标记与页面一起呈现(即在服务器响应期间)。request.POST因此,如果您不故意将 POST 作为上下文变量发送到页面(但它不会是 request.POST - 只是 some_variable),则无法获取页面上下文。看起来有点奇怪。。

于 2015-06-28T18:44:19.057 回答
0

您必须在视图函数中处理表单处理。

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

我从未在包含标签中看到任何表单处理,我怀疑这会奏效。上面的视图功能可能会为您指明正确的方向。

于 2015-06-28T20:25:59.007 回答
0

我使用了包含标签,因为我想在不同的模板中使用相同的表单。

您可以简单地重用表单 - 或者在这种情况下您的表单非常简单,您可以使用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)

您尝试这样做的方式将不起作用,因为模板标记代码将在模板呈现之前执行;因此,当用户看到表单时,您的标记代码已经完成。没有办法再次“触发”它;这就是为什么您需要一个传统的视图方法来接受输入到表单中的数据。

于 2015-06-28T20:35:10.067 回答