#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
таблица уже существует.
Обратите внимание, значение создано, а не изменено. Это потому, что на данном этапе еще нет значения. Но если вы проверите после запуска миграции, это будет единственное значение в базе данных.