#python #django #forms
#python #django #формы
Вопрос:
Ниже приведен мой код для того, что, по моему мнению, должно быть рабочей версией формы отправки электронной почты в режиме bootstrap3. После отправки формы я попадаю на страницу благодарности barebones, но я не думаю, что адрес электронной почты отправляется в базу данных, потому что я не вижу в Django admin.
Кроме того, другая причина, по которой я думаю, что это нарушено, заключается в том, что проверка формы, похоже, не работает. Я могу отправить что-то, что не похоже на адрес электронной почты, и меня все еще отправляют на страницу благодарности.
Есть ли у меня проблемы во всех моих файлах или они изолированы в определенной области?
views.py
from django.shortcuts import render
from temp.models import Email
from forms import EmailForm
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email = EmailForm()
email.save()
return render(request, 'temp/thanks.html')
return render(request, 'temp/index.html')
def thanks(request):
return render(request, 'temp/thanks.html')
forms.py
from django import forms
class EmailForm(forms.Form):
email = forms.CharField(max_length=100)
models.py
from django.db import models
class Email(models.Model):
email = models.CharField(max_length=200)
def __unicode__(self): # Python 3: def __str__(self):
return self.email
index.html
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">amp;times;</button>
<h4 class="modal-title" id="myModalLabel">Sign up for the Beta</h4>
</div>
<div class="modal-body">
<!-- The async form to send and replace the modals content with its response -->
<form class="form-horizontal well" data-async data-target="#myModal" action="thanks/" method="POST">
{% csrf_token %}
<fieldset>
<div>Your email address:
<span>
<input type="text" id="modalInput"></input>
</span>
</div>
</fieldset>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
</div>
</div>
<!-- End Modal -->
Ответ №1:
Обновите свое представление до
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email = form.save() #use form to save it in DB
return render(request, 'temp/thanks.html')
return render(request, 'temp/index.html')
Кроме того, используйте models.EmailField()
for email
вместо CharField()
. С EmailField
помощью django данные будут проверены надлежащим образом. Создайте свою форму ModelForm
так, чтобы django сохранял данные в соответствующей модели / таблице.
class EmailForm(forms.ModelForm):
class Meta:
model = Email
Комментарии:
1. @Rohan Спасибо за это. Во втором фрагменте кода это изменение на models.py или forms.py ?
2. @Barnaby, это для формы.
3. Хм, он все еще не отправляется в БД. Кроме того, кажется, что он по-прежнему принимает недопустимые электронные письма
4. Вы также можете использовать EmailField вместо CharField для проверки электронной почты.
5. Почему вы сохраняете form.save() в переменной email? Я думаю, достаточно просто выполнить form.save() .
Ответ №2:
В приведенном ниже коде вы, похоже, повторно инициализируете электронное письмо с пустой формой. Вы также не создаете и не получаете доступ к экземпляру модели электронной почты, в которой будет сохранено электронное письмо.
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email = EmailForm() <<< reinitializing with empty form
email.save()
return render(request, 'temp/thanks.html')
Что вы можете сделать, это:
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email_data = form.cleaned_data['email'] # read form data
email = Email.objects.create(email=email_data) # create model instance
email.save() # save instance
return render(request, 'temp/thanks.html')
Если вы используете ModelForms вместо Form, вы можете выполнить form.save() напрямую, чтобы сохранить модель.
Комментарии:
1. Пробовал это в сочетании с ModelForms, и это все еще не работает. Кроме того, он даже не отправляет в thanks.html страница после отправки формы.
2. Можете ли вы подключить pdb и сообщить мне, где ошибка.
Ответ №3:
У вас три ошибки. Во-первых, вы должны использовать представление индекса для передачи EmailForm в index.html . Во-вторых, то, что у вас есть в представлении индекса сейчас (исправлено в соответствии с предыдущими ответами), должно быть перемещено в представление благодарности, чтобы получить то, что было введено пользователем в форме электронной почты. И, наконец, вы должны исправить свой шаблон, чтобы включить переданную форму электронной почты.
Ответ №4:
Я думаю, ваша форма не становится действительной, поэтому она не отправляется. Так почему бы вам не написать свой шаблон следующим образом:
<form action="thanks/" method="post">
{% csrf_token %}
<div>Your email address:
{{ form.as_p }} </div> <!-- just for testing -->
<input type="submit" value="Submit" />
</form>
и в формах:
class EmailForm(forms.Form):
email = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'id': 'myModel'})) #Seems, here you want your email's input field id to myModel
и в представлениях:
if form.is_valid():
emaildata=Email() #Model email instance
emaildata.email= form.cleaned_data['email']
emaildata.save()
# or try saveing like zaphod suggested
Редактировать
Если вы хотите продолжать использовать свой шаблон, я предлагаю вам отказаться от формы. В представлениях вы получите данные по request.body
.(Я думаю, вы используете ajax для сохранения данных) Например:
def index(request):
if request.POST:
data= request.body
emaildata = Email() #Model Email instance
emaildata.email= str(data)
emaildata.save()
return render(request, 'temp/thanks.html')
return render(request, 'temp/index.html')
Ответ №5:
Вы сохраняете пустую форму вместо данных from в модели с данными запроса. Использование ModelForm более простое и легкое, достаточно просто сохранить форму. И используйте вместо EmailField поле CharField лучше для проверки строк адреса электронной почты
forms.py
from django.forms import ModelForm
from temp.models import Email
class EmailForm(forms.ModelForm):
class Meta:
model = Email
views.py
from django.shortcuts import render
from temp.models import Email
from temp.forms import EmailForm
def index(request):
if request.method == 'POST':
# POST, get the data from the form
form = EmailForm(request.POST)
if form.is_valid():
# if is valid, just save, and return a new page with thanks
form.save()
return render(request, 'temp/thanks.html')
else:
# Form has errors, re-render with data and error messages
return render(request, 'temp/index.html', {'form': form,})
else:
# GET, render new empty form
form = EmailForm()
return render(request, 'temp/index.html', {'form': form,})
Комментарии:
1. Получение этой ошибки в forms.py код:
NameError at / name 'forms' is not defined
есть идеи, почему?2. Какая версия Django у вас запущена? И откуда у вас эта ошибка? Я имею в виду в консоли, такой как ipython или на странице отладки?
3. версия 1.6.5 и на странице отладки
4. Вы импортируете форму таким
from temp.forms import EmailForm
образом?5. Да, точно скопировал ваш код. Я предполагаю, что ошибка в forms.py ?