Тег включения 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). Это выглядит немного странно..