Форма Django отправляет (я думаю), но не отправляет в базу данных

#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 ?