Как исправить ошибку «объект типа 'NewsletterUser' не имеет len ()» для приложения рассылки в Django - PullRequest
0 голосов
/ 19 июня 2020

Я создал новый информационный бюллетень для отправки электронных писем при статусе «Опубликован», но я продолжаю получать его после сохранения, хотя предполагается, что информационный бюллетень будет отправлен по электронной почте.

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

TypeError at /control/newsletter/
object of type 'NewsletterUser' has no len() 

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

Я не знаю, что такое причина этой ошибки и как ее исправить, я выбрал адрес электронной почты, но все же

Вот models.py:

class Newsletter(models.Model):
    EMAIL_STATUS_CHOICES = (
        ('Draft', 'Draft'),
        ('Published', 'Published')
    )
    subject = models.CharField(max_length=250)
    body = models.TextField()
    email = models.ManyToManyField(NewsletterUser)
    status = models.CharField(max_length=10, choices=EMAIL_STATUS_CHOICES)
    created = models.DateTimeField(default=timezone.now)
    updated = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.subject

Вот views.py

def control_newsletter(request):
    form = NewsletterCreationForm(request.POST or None)

    if form.is_valid():
        instance = form.save()
        newsletter = Newsletter.objects.get(id=instance.id)
        if newsletter.status == "Published":
            subject = newsletter.subject
            body = newsletter.body
            from_email = settings.EMAIL_HOST_USER
            for email in newsletter.email.all():
                send_mail(subject=subject, from_email=from_email, recipient_list=[
                          email], message=body, fail_silently=False)
    context = {
        "form": form,
    }
    template = 'control_newsletter.html'
    return render(request, template, context)


def control_newsletter_list(request):
    newsletter = Newsletter.objects.all()
    paginator = Paginator(newsletter, 10)
    page = request.GET.get('page')

    try:
        items = paginator.page(page)
    except PageNotAnInteger:
        items = paginator.page(1)
    except EmptyPage:
        items = paginator.page(paginator.num_pages)

    index = items.number - 1
    max_index = len(paginator.page_range)
    start_index = index - 5 if index >= 5 else 0
    end_index = index + 5 if index <= max_index - 5 else max_index
    page_range = paginator.page_range[start_index:end_index]

    context = {
        "items": items,
        "page_range": page_range
    }
    template = "control_newsletter_list.html"
    return render(request, template, context)


def control_newsletter_detail(request, pk):
    newsletter = get_object_or_404(Newsletter, pk=pk)
    context = {
        "newsletter": newsletter,
    }
    template = "control_newsletter_detail.html"
    return render(request, template, context)


def control_newsletter_edit(request, pk):
    newsletter = get_object_or_404(Newsletter, pk=pk)

    if request.method == 'POST':
        form = NewsletterCreationForm(request.POST, instance=newsletter)

        if form.is_valid():
            newsletter = form.save()

            if newsletter.status == "Published":
                subject = newsletter.subject
                body = newsletter.body
                from_email = settings.EMAIL_HOST_USER
                for email in newsletter.email.all():
                    send_mail(subject=subject, from_email=from_email, recipient_list=[
                        email], message=body, fail_silently=False)

            return redirect('control_panel:control_newsletter_detail', pk=newsletter.pk)
    else:
        form = NewsletterCreationForm(instance=newsletter)
    context = {
        "form": form,
    }
    template = 'control_newsletter.html'
    return render(request, template, context)


def control_newsletter_delete(request, pk):
    newsletter = get_object_or_404(Newsletter, pk=pk)

    if request.method == 'POST':
        form = NewsletterCreationForm(request.POST, instance=newsletter)

        if form.is_valid():
            newsletter.delete()

            return redirect('control_panel:control_newsletter_list')
    else:
        form = NewsletterCreationForm(instance=newsletter)
    context = {
        "form": form,
    }
    template = 'control_newsletter_delete.html'
    return render(request, template, context)

вот urls.py

from newsletters.views import control_newsletter, control_newsletter_list, control_newsletter_detail, control_newsletter_edit, control_newsletter_delete

app_name = 'newsletters'

urlpatterns = [
    path('newsletter/', control_newsletter, name="control_newsletter"),
...