TypeError at / email-signup Объект типа 'WSGIRequest' не JSON сериализуемый - PullRequest
0 голосов
/ 18 января 2020

В настоящее время пытаюсь заставить работать почтовую рассылку с django 2.2 и MailChimp. Получил код из видео YouTube, я думал, что я понял, но потом я столкнулся с ошибкой в ​​названии. Я пробовал разные вещи, такие как просто передача данных = данные в функции подписки, но ничего, что я пробовал, не сработало Меня беспокоит то, что на видео все работало очень хорошо, и, поскольку оно не старое, я не думаю, что django значительно изменилось. Буду признателен за любую помощь / объяснение.

views.py (не все импортные)

from django.conf import settings
from .forms import EmailSignupForm
from django.http import HttpResponseRedirect
import json
import requests


MAILCHIMP_API_KEY = settings.MAILCHIMP_API_KEY
MAILCHIMP_DATA_CENTER = settings.MAILCHIMP_DATA_CENTER
MAILCHIMP_EMAIL_LIST_ID  = settings.MAILCHIMP_EMAIL_LIST_ID
api_url = 'https://{dc}.api.mailchimp.com/3.0'.format(dc=MAILCHIMP_DATA_CENTER)
members_endpoint = '{api_url}/lists/{list_id}/members'.format(
    api_url=api_url,
    list_id=MAILCHIMP_EMAIL_LIST_ID
)

def subscribe(email):
    data = {
        "email_address": email,
        "status": "subscribed",
    }
    print(data)
    print(data[])
    r = requests.post(
        members_endpoint,
        auth=("", MAILCHIMP_API_KEY),
        data=json.dumps(data), # I think the error is caused here
    )
    return r.status_code, r.json()


def email_list_signup(request):
    form = EmailSignupForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            email_signup_qs = Signup.objects.filter(email=form.instance.email)
            if email_signup_qs.exists():
                messages.info(request, "You are already subscribed")
            else:
                subscribe(form.instance.email)
                messages.success(request, "You have subscribed successfully!")
                form.save()
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

class HomeView(ListView):
    template_name = "home.html"
    model = Post
    form_class=EmailSignupForm


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        form = EmailSignupForm()
        context['form'] = form
        return context

    def get_queryset(self):
        return Post.objects.all().order_by('-published_date')[:5]

urls.py

from . import views
from django.conf.urls import url
urlpatterns = [
    url(r'^email-signup$', views.subscribe,name="email-signup"),
]

forms.py

class EmailSignupForm(forms.ModelForm):
    email = forms.EmailField(widget=forms.TextInput(attrs={
        "type": "email",
        "name": "email",
        "id": "email",
        "placeholder": "Type your email address",
    }), label="")

    class Meta:
        model = Signup
        fields = ('email', )

форма в home. html

{% block emailsignup %}
<div class="enter_email sidebar_element">
    <p class="white">Get all new posts E-Mailed to you! No Ads, we promise.</p>
    <form class="form " method='GET' action="{% url 'blog:email-signup' %}">
        {% csrf_token %}
        <!-- <input class="form-control " type="text" placeholder="Your email" name="email"> -->
        {{ form }}
        <button method="POST" class="btn btn-primary w-100 my-3" type="submit">Enter</button>
    </form>
</div>
{% endblock %}

если какой-либо код отсутствует, пожалуйста, дайте мне знать Спасибо большое за помощь.

1 Ответ

0 голосов
/ 19 января 2020

Я решил это. Главное было изменить саму форму. После отслеживания вызовов функций, как было предложено, я смог выяснить, что функция подписки даже не вызывалась. Я исследовал и обнаружил, что в моей форме вместо метода «POST» используется метод «GET». URL в атрибуте action был правильным, но у кнопки также был метод post, который я удалил (хотя я не знаю, было ли это необходимым). Затем я изменил URL-адрес в urls.py на путь, который не должен иметь никакого значения, но я полагаю, что это хорошая практика в более новых django версиях. Я также добавил в форму enctype = "multipart / form-data", что, по моим тестам, не обязательно. Таким образом, окончательные файлы будут иметь вид

в home. html:

{% block emailsignup %}
<div class="enter_email sidebar_element">
    <p class="white">Get all new posts E-Mailed to you! No Ads, we promise.</p>
    <form class="form " method='POST' action="{% url 'blog:email-signup' %}" >
        {% csrf_token %}
        <!-- <input class="form-control " type="text" placeholder="Your email" name="email"> -->
        {{ form }}
        <button class="btn btn-primary w-100 my-3" type="submit">Enter</button>
    </form>
</div>
{% endblock %}

urls.py :

from . import views
from django.conf.urls import url
from django.urls import path

urlpatterns = [
    path('email-signup/', views.email_list_signup, name='email-signup'),
]

views.py :

from django.conf import settings
from .forms import EmailSignupForm
from django.http import HttpResponseRedirect
import json
import requests


MAILCHIMP_API_KEY = settings.MAILCHIMP_API_KEY
MAILCHIMP_DATA_CENTER = settings.MAILCHIMP_DATA_CENTER
MAILCHIMP_EMAIL_LIST_ID = settings.MAILCHIMP_EMAIL_LIST_ID

api_url = 'https://{dc}.api.mailchimp.com/3.0'.format(dc=MAILCHIMP_DATA_CENTER)
members_endpoint = '{api_url}/lists/{list_id}/members'.format(
    api_url=api_url,
    list_id=MAILCHIMP_EMAIL_LIST_ID
)


def subscribe(email):
    data = {
        "email_address": email,
        "status": "subscribed"
    }
    r = requests.post(
        members_endpoint,
        auth=("", MAILCHIMP_API_KEY),
        data=json.dumps(data)
    )
    return r.status_code, r.json()


def email_list_signup(request):
    form = EmailSignupForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            email_signup_qs = Signup.objects.filter(email=form.instance.email)
            if email_signup_qs.exists():
                messages.info(request, "You are already subscribed")
                print("in email_list_signup already subscribed.")
            else:
                subscribe(form.instance.email)
                messages.info(request, "You have been successfully subscribed.")
                print("in email_list_signup you have been subscribed")
                form.save()
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

Другие файлы, не упомянутые снова, остаются прежними. Спасибо за помощь, ребята

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...