Как вызвать функцию в шаблоне Django?

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

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

Это мой views.py:

class SubscriberListView(LoginRequiredMixin, SingleTableView):
model = EmailMarketing
table_class = EmailMarketingTable
template_name = 'marketing/subscribers.html'


# Get emails from email server
# Connection settings
HOST = 'xXxxxxXxXx'
USERNAME = 'xXxxxxXxXx'
PASSWORD = "xXxxxxXxXx"

m = imaplib.IMAP4_SSL(HOST, 993)
m.login(USERNAME, PASSWORD)
m.select('INBOX')

def get_emails():
    result, data = m.uid('search', None, "ALL")
    if result == 'OK':
        for num in data[0].split():
            result, data = m.uid('fetch', num, '(RFC822)')
            if result == 'OK':
                email_message_raw = email.message_from_bytes(data[0][1])
                email_from = str(make_header(decode_header(email_message_raw['From'])))
                email_addr = email_from.replace('<', '>').split('>')
                if len(email_addr) > 1:
                    new_entry = EmailMarketing(email_address=email_addr[1])
                    new_entry.save()
                else:
                    new_entry = EmailMarketing(email_address=email_addr[0])
                    new_entry.save()
            

# Close server connection
m.close()
m.logout()

А вот что я пробовал на urls.py:

    from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path('', views.marketing, name='marketing'),
    path('/getemails', views.get_emails, name='getemails'),
]

Затем на моем файле subscribers.html я попробовал следующее:

    <button type="submit" onclick="location.href='{% url 'getemails' %}'" class="btn btn-primary">Get Emails</button>

Но я получаю ошибку:

Reverse for 'getemails' not found. 'getemails' is not a valid view function or pattern name.

Как я могу вызвать эту функцию, определенную в моем views.py, внутри моего шаблона?

Должно быть {% url 'getemails' %} так:

  <button type="submit" onclick="location.href='{% url 'getemails' %}'" class="btn btn-primary">Get Emails</button>

Примечание: Всегда указывайте / в конце каждого маршрута, поэтому урлы должны иметь вид path('getemails/'...).

Редактирование:

Похоже, что вы используете тег <form>, поэтому просто определите атрибут action следующим образом:

<form method='POST' action="{% url 'getemails' %}">

Django по умолчанию не использует файлы, специфичные для приложений urls.py. Вы должны include их в вашем основном urls.py, например:

from django.urls import include, path

urlpatterns = [
    path('marketing/', SubscriberListView.as_view(), name='marketing'),
    path('myapp/', include('myapp.urls')),
    ...
]

Предположим, что имя вашего приложения myapp.

Вернуться на верх