Строка темы электронного письма для сброса пароля Django: содержит ‘example.com

#django #email

#django #Адрес электронной почты

Вопрос:

Я использую общий вид django.contrib.auth.views.password_reset для формы сброса пароля. В принципе, все это работает, за исключением того, что строка темы отправляемого электронного письма содержит ‘example.com’, например: «Сброс пароля на example.com «.

Итак, я осмотрелся, но, хоть убейте, я не могу понять, как я могу изменить это, чтобы оно содержало мое фактическое доменное имя.

Есть идеи?

Ответ №1:

PasswordResetForm Отправляет электронное письмо на основе вашего contrib.sites . Он получает имя домена для использования и передает его в html-шаблон по адресу registration/password_reset_email.html

django/trunk/django/contrib/auth/forms.py:

 ...
4     from django.contrib.sites.models import get_current_site
...

123     def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
124              use_https=False, token_generator=default_token_generator, from_email=None, request=None):
125         """
126         Generates a one-use only link for resetting password and sends to the user
127         """
128         from django.core.mail import send_mail
129         for user in self.users_cache:
130             if not domain_override:
131                 current_site = get_current_site(request)
132                 site_name = current_site.name
133                 domain = current_site.domain
134             else:
135                 site_name = domain = domain_override
136             t = loader.get_template(email_template_name)
137             c = {
138                 'email': user.email,
139                 'domain': domain,
140                 'site_name': site_name,
141                 'uid': int_to_base36(user.id),
142                 'user': user,
143                 'token': token_generator.make_token(user),
144                 'protocol': use_https and 'https' or 'http',
145             }
146             send_mail(_("Password reset on %s") % site_name,
147                 t.render(Context(c)), from_email, [user.email])
  

используйте admin или оболочку django, чтобы изменить site

прочитайте больше о фреймворке сайтов here .

Как Django использует фреймворк сайтов

Хотя вам не обязательно использовать платформу sites framework, это настоятельно рекомендуется, потому что Django использует ее в нескольких местах. Даже если ваша установка Django поддерживает только один сайт, вам следует потратить две секунды на создание объекта site с вашим доменом и именем и указать его идентификатор в настройках SITE_ID.

в командной оболочке вы можете сделать это, выполнив:

 >>> from django.contrib.sites.models import Site
>>> my_site = Site(domain='some_domain.com', name='Some Domain')
>>> my_site.save()
>>> print my_site.id
2
>>>
  

в вашем settings.py:

 SITE_ID = 2
  

или

 >>> my_site = Site.objects.get(pk=1)
>>> my_site.domain = 'somedomain.com'
>>> my_site.name = 'Some Domain'
>>> my_site.save()
  

в вашем settings.py:

 SITE_ID = 1
  

Комментарии:

1. Спасибо за подробный ответ!

2. Вы также можете сделать это через администратора. Нажмите на Сайты, затем отредактируйте «example.com «это там, и Django теперь отправит электронное письмо для сброса пароля с этими настройками.

3. Я все еще не могу поверить, что нет способа (в 2019 году!) настроить это «с нуля» при первоначальной миграции. Я предполагаю, что вы можете написать перенос данных «вручную», который затем удаляет значение по умолчанию «example.com «введите SITE_ID=1, затем добавьте любую группу сайтов, которая вам нужна, но, думаю, было бы неплохо инициализировать ее, используя содержимое ALLOWED_HOSTS, если оно определено…

4. Это кажется неправильным. Ввод этого кода в settings.py вызывает: django.core.exceptions. AppRegistryNotReady: приложения еще не загружены.

Ответ №2:

Предполагая, что у вас есть сайт администратора, перейдите в группу «сайты» и измените первый из них на свой домен?

Либо это, либо что-то в settings.py . http://docs.djangoproject.com/en/dev/topics/settings/#the-basics

Я просто проверю и выясню для вас

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

Я совершенно уверен, что это то, что я сделал, чтобы заставить это работать на меня.

Ответ №3:

Просмотрев так много ответов, я сразу углубился в базовый код. Затем я нашел простой способ настроить это.

шаг 1: Сначала проверьте, есть ли у вас password_reset_subject.txt файл или нет. Если нет, создайте password_reset_subect.txt amp; скопируйте приведенный ниже код и вставьте его туда.

 {% load i18n %}{% autoescape off %}
{% blocktranslate %}Password reset{{ site_name }}{% endblocktranslate %}
{% endautoescape %}
  

шаг 2: Теперь вам нужно переопределить subject_template_name в методе сохранения.
пример класса Passwordresetserializer (PasswordResetSerializer):

 def save(self):
    request = self.context.get('request')
    opts = {
        'use_https': request.is_secure(),
        'from_email': getattr(settings, 'DEFAULT_FROM_EMAIL'),
        '**subject_template_name':'registration/password_reset_subject.txt**',#it should be your file path.
        'request': request,
        'html_email_template_name':'registration/password_reset_email.html',
    }
    opts.update(self.get_email_options())
    self.reset_form.save(**opts) 
  

Ответ №4:

Это просто, просто перейдите кhttp://127.0.0.1:8000/admin/sites/site / если оно находится на локальном хостинге, удалите example.com и нажмите добавить домен сайта = 127.0.0.1 имя = 127.0.0.1

перейдите в настройки проекта и измените SITE_ID = 2

Ответ №5:

Автоматический способ

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

Эта миграция может быть создана в существующем приложении, или вы можете создать приложение специально для этой цели:

 #remember to add your_app_name to settings.py, to enable the app
python manage.py startapp your_app_name
  

Теперь создайте пустую миграцию следующим образом:

 python manage.py makemigrations --empty your_app_name
  

Это создаст файл миграции ‘skeleton’. Вам нужно будет заполнить его. Например:

 from django.contrib.sites.models import Site
from django.db import migrations


def configure_sites_framework(apps, schema_editor):
    Site.objects.create(domain='my-domain-name.com', name='my-domain-name.com')

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('sites', '__latest__'),
    ]

    operations = [
        migrations.RunPython(configure_sites_framework),
    ]
  

Конечно, нашему приложению не обязательно иметь модель или что-то еще. Это зависит от sites миграции приложений, которая гарантирует, что ваша специальная миграция будет запущена, когда sites таблица уже существует.

Обратите внимание, значение создано, а не изменено. Это потому, что на данном этапе еще нет значения. Но если вы проверите после запуска миграции, это будет единственное значение в базе данных.