модели django не принимают электронное письмо?

#python #django

#python #django

Вопрос:

пытаюсь настроить небольшой веб-сайт, новичок в django. когда я создаю настройку рассылки в django, но электронное письмо не сохраняет панель администратора. вот мои коды. взгляните.

models.py

 class Newsletter(models.Model):
email = models.CharField(max_length=200)

def __str__(self):
    return self.email
  

views.py

 def Newsletter(request):
if request.method=="POST":
    email = request.POST.get("email")
    email = email(email=email)
    email.save()
    message.success(request, "email Successfully added")

return render(request, 'index.html')
  

urls.py

 path('newsletter', views.Newsletter, name="newsletter"),
  

шаблон

 <div id="mc_embed_signup" class="subscribe-form subscribe-form-dec subscribe-mrg">
                        <form id="Newsletter" class="validate subscribe-form-style" novalidate=""  name="Newsletter" method="post" action="/Newsletter">
                            
                            <div id="mc_embed_signup_scroll" class="mc-form">
                                <input class="email" type="email" required="" placeholder="Your email address…" name="Newsletter" value="" id="Newsletter">
                                <div class="mc-news" aria-hidden="true">
                                    <input type="text" value="" tabindex="-1" name="Subscribers">
                                </div>
                                <div class="clear">
                                    {% csrf_token %}
                                    <input id="mc-embedded-subscribe" class="button" type="submit" name="subscribe" value="Subscribe">
                                </div>
                            </div>
  

Комментарии:

1. Какую ошибку вы получаете?

2. Ничего не получается. просто загружается.

3. Это может означать, что ваша база данных заблокирована. Если вы используете SQLite, убедитесь, что он не открыт ни в какой другой программе. Перезагрузите компьютер, чтобы убедиться.

Ответ №1:

models.py

 class Newsletter(models.Model):
    email = models.CharField(max_length=200)

    def __str__(self):
        return self.email
  

views.py:

Здесь, возможно, вы переопределяете имя представления именем модели, попробуйте это:

 from .models import Newsletter


def adding_email_to_newsletter(request):
    if request.method=="POST":
        email = request.POST.get("email")
        Newsletter.objects.get_or_create(email=email)
        message.success(request, "email Successfully added")

return render(request, 'index.html')
  

в urls.py

 path("adding_email_to_newsletter", views.adding_email_to_newsletter, name="adding_email_to_newsletter"),
  

шаблон:

Здесь вы пропускаете csrf_token, который требуется для отправки сообщений по умолчанию docs, и использование тега url для лучших практик.

 <div id="mc_embed_signup" class="subscribe-form subscribe-form-dec subscribe-mrg">
    <form id="Newsletter" class="validate subscribe-form-style" novalidate=""  name="Newsletter" method="post" action="{% url 'adding_email_to_newsletter' %}">
    {% csrf_token %}
    
        <div id="mc_embed_signup_scroll" class="mc-form">
            <input class="email" type="email" required="" placeholder="Your email address…" name="Newsletter" value="" id="Newsletter">
            <div class="mc-news" aria-hidden="true">
                <input type="text" value="" tabindex="-1" name="Subscribers">
            </div>
            <div class="clear">
                {% csrf_token %}
                <input id="mc-embedded-subscribe" class="button" type="submit" name="subscribe" value="Subscribe">
            </div>
        </div>
    </form>
</div>
  

Комментарии:

1. Это будет выполняться точно так же, как код в вопросе, за исключением того, что не произойдет сбой, если электронное письмо уже существует, что не является проблемой, о которой спрашивал OP.

2. вы назвали представление таким же, как ваша модель, и оно переопределяет

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

4. я сделал это, потому что увидел много вещей для улучшения кода. переопределение было только одним, он пропустил csrf_token, он не использовал модель для создания экземпляра, он не использовал URL-адреса в шаблоне и т.д.

5. Это здорово, но я думаю, что op помогло бы больше, если бы он понял, что вызвало его первоначальную проблему, это помогло бы ему еще больше, если бы вы объяснили свои другие изменения, но это выходило бы за рамки вопроса. «Замените свой код этим» не помогает ему стать лучшим программистом. Простое упоминание о том, что рекурсия вызывает зависание, вероятно, очень поможет ему.