Django отправляет пользователю электронное письмо со ссылкой пользователя для установки пароля

#django #django-forms #django-admin

Вопрос:

Я новичок в Django и изучаю его документацию. В моем приложении Django я пытаюсь заставить администратора создать пользователей, и как только они будут созданы, я хотел бы, чтобы им было отправлено электронное письмо, содержащее ссылку, которая позволяет пользователю установить свой собственный пароль для входа в систему.
Ниже приведен мой admin.py файл:

 class UserAuthenticationAdmin(admin.ModelAdmin):
    list_display = ('first_name','last_name','email','department',)
    list_filter = ('date_joined',)
    ordering = ('first_name',)
    search_fields = ('email',)
    add_form_template = 'admin/change_form.html'
    form = UserAuthenticationForm
    fieldsets = (
        (None, {
            'fields': (('first_name','last_name','password'),'email','department','is_active','is_staff','groups',)
        }),
    )
 

Ниже приведен html-шаблон электронной почты:

 <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Successful Account Creation</title>
</head>

<body>
    <p>Dear {{ first_name }} {{ last_name }},</p>
    <p>Your account has successfully been created.</p>
    <p>Please follow this link,

        <a href="{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}"> your account </a>, to set up your password.
    </p><br>
    <p>Thanks</p>
</body>

</html>
 

Ниже приведен UserAuthenticationForm класс в forms.py файле, который создает пароль по умолчанию для пользователя:

 class UserAuthenticationForm(forms.ModelForm):

    password = forms.CharField(
        widget=forms.PasswordInput(
            attrs={
                "placeholder" : "Password",                
                "class": "form-control",
                "value":"pass@123",
            }
        ))
        
    class Meta:
        model = UserAuthentication
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
            })
            
    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password"])
        subject = "Account Creation"
        email_template_name = "emails/successfull_creation.html"
        from_email = app.EMAIL_HOST_USER    
        c = {
        'first_name': user.first_name,
        'last_name': user.last_name,
        "email":user.email,
        'domain':'127.0.0.1:8000',
        'site_name': 'Website',
        "uid": urlsafe_base64_encode(force_bytes(user.email)),
        "user": user,
        'token': default_token_generator.make_token(user),
        'protocol': 'http',
        }
        email_html = render_to_string(email_template_name, c)
        email = EmailMultiAlternatives(subject=subject, to=[user.email])
        email.attach_alternative(email_html, 'text/html')
        email_sent =  email.send(fail_silently=False)
        if commit:
            user.save()
        return user 
 

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

Я попытался заменить save() функцию в UserAuthenticationForm классе приведенным ниже кодом, но электронное письмо не отправляется созданному пользователю.

     def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            new_user = user.save()
            reset_form = PasswordResetForm({'email': new_user.email})
            assert reset_form.is_valid()
            reset_form.save(
                email_template_name='emails/successfull_creation.html',
            )
        return user 
 

Я хотел бы получить любую помощь в том, чтобы в бэкэнде было отправлено электронное письмо со ссылкой для пользователя, чтобы установить свой пароль. Заранее спасибо.

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

1. это может помочь вам на данный момент: simpleisbetterthancomplex.com/tutorial/2017/02/18/… но вы должны изменить код для своего варианта использования.

2. Привет! вы нашли какую-нибудь статью или руководство по этому поводу?