Как добавить опцию подписки на сайте Django
Я пытаюсь добавить опцию подписки на рассылку новостей на сайт django. Когда посетитель вводит правильный адрес электронной почты, он будет сохранен в базе данных. Форма подписки является частью шаблона base.html. Все остальные шаблоны сайта расширяют этот шаблон. Я хочу реализовать это DRY способом. Вот как я пытаюсь это сделать :
forms.py :
from dataclasses import fields
from django import forms
from . models import Subscribers, MailMessage
class SubcribersForm(forms.ModelForm):
class Meta:
model = Subscribers
fields = ['email', ]
views.py :
def base(request):
if request.method == 'POST':
form = SubcribersForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
form = SubcribersForm()
context = {'form': form}
return render(request, 'base.html', context)
Шаблон: base.html
<form method = "POST" class="signup-form form-inline justify-content-center pt-3">
{% csrf_token %}
<div class="form-group">
<label class="sr-only" for="semail">{{context}}</label>
<input type="email" id="semail" name="semail1" class="form-control mr-md-1 semail" placeholder="Enter email">
</div>
<button type="submit" class="btn btn-primary">Subscribe</button>
</form>
models.py :
class Subscribers(models.Model):
email = models.EmailField(null=True)
date = models.DateTimeField(auto_now_add=True)
def __str__self(self):
return self.email
В бэкенде я вижу, что таблица Subscribers была создана. Однако, когда я ввожу любой адрес электронной почты с главной и нажимаю кнопку подписаться, он не сохраняется в базе данных. В чем здесь может быть проблема?
Возможно, в вашей форме не объявлено действие. Предположим, что у вас есть такой url:
path('add-subscriber/', base, name='base'),
... вашей форме потребуется способ вызвать его после отправки, например, так:
<form method = "POST" action="{% url 'base' %}" class="signup-form form-inline justify-content-center pt-3">
{% csrf_token %}
<div class="form-group">
<label class="sr-only" for="semail">{{context}}</label>
<input type="email" id="semail" name="semail1" class="form-control mr-md-1 semail" placeholder="Enter email">
</div>
<button type="submit" class="btn btn-primary">Subscribe</button>
</form>