Тег включения Django не публикуется в базе данных

Я пытаюсь создать форму для сохранения имен и адресов электронной почты в моей базе данных. Тем не менее, это не сохраняет... Я использовал тег включения, потому что я хочу использовать одну и ту же форму в разных шаблонах. Это мой 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()}

После того, как я заполнил и отправил форму, я ничего не вижу в своей базе данных. Я что-то пропустил? Спасибо!

3 ответа

Решение

Я использовал тег включения, потому что хочу использовать одну и ту же форму в разных шаблонах.

Вы можете просто повторно использовать форму - или, поскольку ваша форма в этом случае очень проста, вы можете использовать CreateView общий вид на основе классов и еще больше сократит ваш код.

Ваше мнение будет содержать только следующее:

class OfferForm(CreateView):
    template_name = 'fragen/askforoffer.html'
    model = Contact
    fields = ['gender', 'first_name', 'last_name', 'email']
    success_url = 'fragen/thanks.html'

Джанго автоматически создаст 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)

То, как вы пытаетесь это сделать, не сработает, потому что код тега шаблона будет выполнен до визуализации шаблона; так что к тому времени, когда пользователь увидит форму, ваш код тега уже закончен. Нет способа "вызвать" его снова; вот почему вам нужен традиционный метод просмотра, который будет принимать данные, введенные в форму.

Вы должны обрабатывать обработку форм в функции представления.

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

Я никогда не видел обработки формы в теге включения, и я сомневаюсь, что это сработает. Выше функция просмотра может указывать вам в правильном направлении.

Post это метод запроса к серверу, который обрабатывается представлениями.

Тег включения отображается вместе со страницей (то есть во время ответа сервера). Таким образом, контекст страницы не может получить request.POST - конечно, если вы не отправляете POST преднамеренно как переменную контекста на страницу (но это не будет request.POST - просто some_variable). Это выглядит немного странно..

Другие вопросы по тегам