Письмо с подтверждением со ссылкой для активации не отображается в консоли

Я написал код для регистрации, в котором после ввода имени и пароля он перенаправит нас на страницу отправки электронной почты, а также предполагает отправку почты в консоли, но она не появляется.

просмотры.py

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            subject = 'Activate Your MySite Account'
            message = render_to_string('user/account_activation_email.html', {
            'user': user,
            'domain': current_site.domain,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'token': account_activation_token.make_token(user),
        })
        user.email_user(subject, message)
        return redirect('account_activation_sent')
    else:
        form = SignUpForm()
    return render(request, 'user/register.html', {'form': form})

settings.py

Настройка электронной почты в настройках.

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

urls.py

Это сопоставление URL-адресов, используемое ниже.

urlpatterns = [
    path('register/', signup,name='sinup_user'),
    path('password_reset/',auth_view.PasswordResetView.as_view(), name='password_reset'),
path('password_reset/done/',auth_view.PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/done',auth_view.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
    path('account_activation_sent/', account_activation_sent, name='account_activation_sent'),
    path('activate/<uidb64>/<token>/', activate, name='activate'),

]

path('reset///',auth_view.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),

account_activation_email.html

Это шаблон консоли, который был использован.

{% autoescape off %}
Hi {{ user.username }},

Please click on the link below to confirm your registration:

http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}

Приставка

Приведенные ниже формулировки отображаются в консоли, но почта здесь не отображается.

System check identified no issues (0 silenced).
October 12, 2019 - 12:50:55
Django version 2.2.6, using settings 'music.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[12/Oct/2019 12:51:41] "GET /user/register/ HTTP/1.1" 200 4282
[12/Oct/2019 12:52:03] "POST /user/register/ HTTP/1.1" 302 0
[12/Oct/2019 12:52:03] "GET /user/account_activation_sent/ HTTP/1.1" 200 

person Sanjay    schedule 12.10.2019    source источник


Ответы (2)


Вам нужно убедиться, что серверная часть электронной почты настроена правильно в settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Кроме того, код, который отправляет электронное письмо, должен иметь отступ под «if form.is_valid():», иначе вы будете перенаправлены на «account_activation_sent», даже если форма недействительна.

Предложение else: также требует правильного отступа.

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            subject = 'Activate Your MySite Account'
            message = render_to_string('account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })
            user.email_user(subject, message)
            return redirect('account_activation_sent')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

См. также https://simpleisbetterthancomplex.com/tutorial/2017/02/18/how-to-create-user-sign-up-view.html

Или вы можете использовать django-allauth, который сделает все это за вас, и просто модифицирует шаблоны по умолчанию.

person Chris    schedule 12.10.2019
comment
Отступы исправлены, на самом деле это было размещено по ошибке в вопросе. Я сослался на ту же ссылку, что вы упомянули выше, и просто сделал то же самое, что они сказали на этом сайте, и EMAIL_BACKEND также я установил точно так, как они сказали, но все равно это не решено. - person Sanjay; 12.10.2019
comment
Как насчет «из mysite.core.forms импортировать SignUpForm» и заменить SinupForm на SignUpForm - person Chris; 12.10.2019
comment
Пожалуйста, не могли бы вы опубликовать шаблоны и urls.py - person Chris; 12.10.2019
comment
Исправлена ​​​​SignUpForm, она не выдает никаких ошибок, как раньше, но по-прежнему не отправляет почту на консоль. - person Sanjay; 12.10.2019
comment
теперь user.email_user(subject, message) и return redirect('account_activation_sent') имеют отступ в 12 пробелов? - person Chris; 12.10.2019
comment
Крис, я скопировал и вставил код, который вы указали выше, но он не решил. Я пытался разместить сопоставление URL-адресов здесь, но стек не позволяет это сделать. - person Sanjay; 12.10.2019
comment
Проверка системы не выявила проблем (0 отключено). 12 октября 2019 г., 12:50:55 Django версии 2.2.6 с использованием настроек «music.settings». Запуск сервера разработки по адресу 127.0.0.1:8000 Закройте сервер, нажав CONTROL-C. [12.10.2019 12:51:41] GET /user/register/ HTTP/1.1 200 4282 [12.10.2019 12:52:03] POST /user/register/ HTTP/1.1 302 0 [12.10.2019 /2019 12:52:03] ПОЛУЧИТЬ /user/account_activation_sent/ HTTP/1.1 200 67 - person Sanjay; 12.10.2019
comment
На самом деле он не выдает никакой ошибки. Я только что добавил сопоставление URL-адресов, пожалуйста, посмотрите на это, пока я также загружу шаблон - person Sanjay; 12.10.2019
comment
вы получаете код перенаправления (302), попробуйте указать правильное представление в urls.py: path('register/', views.signup, name='sinup_user') 'account_activation_sent' в urls.py также понадобится внимание - person Chris; 12.10.2019
comment
все URL-адреса указывают только на правильный URL-адрес. Я действительно сыт по горло этим, не знаю, где это пошло не так. - person Sanjay; 12.10.2019
comment
в urls.py: from django.conf.urls путь импорта из mysite.core импортирует представления как core_views urlpatterns = [ ... path('signup/', core_views.signup, name='signup'), ] Если вы получить код ответа 302 в вашей консоли, тогда URL-адреса неверны. - person Chris; 12.10.2019

Я сделал ошибку в шаблоне URL.

urls.py

URL с неправильным шаблоном

path('signup/', user_views.signup,name='sinup'),
path('account_activation_sent/', user_views.account_activation_sent, name='account_activation_sent'),
path('activate/<uidb64>/<token>/', user_views.activate, name='activate'),

шаблон URL после исправления

path('account/signup/', user_views.signup,name='sinup'),
path('account/account_activation_sent/', user_views.account_activation_sent, name='account_activation_sent'),
path('account/activate/<uidb64>/<token>/', user_views.activate, name='activate'),

Мне пришлось добавить учетную запись/перед началом URL-адреса, который я пропустил, теперь он работает нормально.

person Sanjay    schedule 21.10.2019