首页 > 解决方案 > 如何从另一个视图发送密码重置邮件?

问题描述

我有一个创建餐厅的想法。在同一视图中,还创建了一个用户。创建用户后,我必须向用户发送一封邮件,其中包含重置密码的链接。

我的观点如下:

def create_restaurant(request):                                                   
form = RestaurantForm()                                                       
user_form = RestaurantUserForm()                                              
if request.method == 'POST':                                                  
    form = RestaurantForm(request.POST, request.FILES)                        
    user_form = RestaurantUserForm(request.POST)                              
    if form.is_valid() and user_form.is_valid():   
        
        #----user is saved here------   
        user_obj = user_form.save() 

        #----have to sent the mail here------                              

        #-----restaurant is saved here-----                                     
        restaurant_obj = form.save()                                          
        restaurant_obj.user = User.objects.get(id=user_obj.id)                
        restaurant_obj.save()                                                 
        messages.success(request, 'Restaurant Added Successfully.')           
        return redirect('create_restaurant')                                  
context = {                                                                   
    "title": "Add restaurant",                                                
    "form": form,                                                             
    "user_form": user_form                                                    
}                                                                             
return render(request, "restaurant/restaurant.html", context)                 

我已经使用

urlpatterns = [
  path('reset_password/',
     auth_views.PasswordResetView.as_view(template_name="password_reset.html"),
     name='password_reset'
     ),

  path('reset_password_sent/',
     auth_views.PasswordResetDoneView.as_view(template_name="password_reset_sent.html"),
     name='password_reset_done'
     ),

  path('reset/<uidb64>/<token>/',
     auth_views.PasswordResetConfirmView.as_view(template_name="password_reset_form.html"),
     name='password_reset_confirm'
     ),

  path('reset_password_complete/',
     auth_views.PasswordResetCompleteView.as_view(template_name="password_reset_done.html"),
     name='password_reset_complete'
     )]

如上所述,我怎样才能发送电子邮件?

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


您可以添加一个函数来处理这样的电子邮件发送

if request.method == 'POST':                                                  
    form = RestaurantForm(request.POST, request.FILES)                        
    user_form = RestaurantUserForm(request.POST)                              
    if form.is_valid() and user_form.is_valid():   
        
        #----user is saved here------   
        user_obj = user_form.save() 

        #----have to sent the mail here------
        ctx = {add all your data which you want to add in your email template}
        send_user_email(ctx)                              
        #-----restaurant is saved here-----                                     
        restaurant_obj = form.save()                                          
        restaurant_obj.user = User.objects.get(id=user_obj.id)                
        restaurant_obj.save()                                                 
        messages.success(request, 'Restaurant Added Successfully.')           
        return redirect('create_restaurant') 

这是您负责发送电子邮件的功能

def send_user_email(ctx):
    mail_subject = ctx['subject']
    message = get_template('email_temp/user_notification.html').render(ctx)
    to_email = ctx['user']
    email = EmailMessage(
        mail_subject,
        message,
        DEFAULT_FROM_EMAIL,
        to=[to_email]
        )
    email.content_subtype = "html"
    email.send(fail_silently=False)
    return JsonResponse({'success':'success'})

你需要导入一些必需的东西

from django.template.loader import get_template
from django.core.mail import EmailMessage

推荐阅读