2016-05-18 16 views
5

Tôi đang sử dụng django-registration với địa chỉ email duy nhất và tôi muốn có thể gửi biểu mẫu kích hoạt thứ hai tới email nếu người dùng yêu cầu và tài khoản chưa hoạt động. Tôi đã tìm thấy điều này link trên Stackoverflow nhưng tôi không hiểu nơi tôi nên đặt thói quen. Tôi đã đặt nó trong views.py của ứng dụng và tôi gặp lỗiDjango-registration gửi lại kích hoạt Email với mã mới

global name 'RegistrationProfile' is not defined 

đó là vì RegistrationProfile là mô hình đăng ký nhưng không tạo bảng/bản ghi trong cơ sở dữ liệu khi kích hoạt biểu mẫu được gửi để tôi không hiểu cách tôi có thể truy cập biểu mẫu đó.

Mọi lời khuyên đều được hoan nghênh.

+0

Bạn đã cố gắng nhập RegistrationProfile từ đăng ký – marcusshep

+0

bạn có ý nghĩa gì khi gửi lại biểu mẫu kích hoạt? Điều đó không có ý nghĩa gì cả. Ý của bạn là gửi lại email kích hoạt? Đây có lẽ là lý do tại sao câu hỏi của bạn không nhận được trả lời trước khi bạn phát hành số tiền thưởng – e4c5

+0

Tôi đã thử nhập RegistrationProfile và có, tôi muốn gửi lại (hoặc gửi một email kích hoạt mới) – HenryM

Trả lời

2

OK, vì vậy đây là giải pháp mà tôi đã đưa ra. Nó có thể không phải là đẹp nhất, nhưng nó làm việc cho tôi.

này sẽ được thêm vào views.py

from .forms import ResendActivationEmailForm 
from django.core import signing 
from django.contrib.sites.shortcuts import get_current_site 
from django.template.loader import render_to_string 


def resend_activation_email(request): 

    email_body_template = 'registration/activation_email.txt' 
    email_subject_template = 'registration/activation_email_subject.txt' 

    if not request.user.is_anonymous(): 
     return HttpResponseRedirect('/') 

    context = Context() 

    form = None 
    if request.method == 'POST': 
     form = ResendActivationEmailForm(request.POST) 
     if form.is_valid(): 
      email = form.cleaned_data["email"] 
      users = User.objects.filter(email=email, is_active=0) 

      if not users.count(): 
       form._errors["email"] = ["Account for email address is not registered or already activated."] 

      REGISTRATION_SALT = getattr(settings, 'REGISTRATION_SALT', 'registration') 
      for user in users: 
       activation_key = signing.dumps(
        obj=getattr(user, user.USERNAME_FIELD), 
        salt=REGISTRATION_SALT, 
        ) 
       context = {} 
       context['activation_key'] = activation_key 
       context['expiration_days'] = settings.ACCOUNT_ACTIVATION_DAYS 
       context['site'] = get_current_site(request) 

       subject = render_to_string(email_subject_template, 
            context) 
       # Force subject to a single line to avoid header-injection 
       # issues. 
       subject = ''.join(subject.splitlines()) 
       message = render_to_string(email_body_template, 
              context) 
       user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) 
       return render(request, 'registration/resend_activation_email_done.html') 

    if not form: 
     form = ResendActivationEmailForm() 

    context.update({"form" : form}) 
    return render(request, 'registration/resend_activation_email_form.html', context) 

này sẽ được thêm vào forms.py

class ResendActivationEmailForm(forms.Form): 
    email = forms.EmailField(required=True) 

Tôi đã một mẫu mới trong đăng ký gọi resend_activation_email_form.html được sử dụng khi email đã được gửi lại nhưng tôi đã sử dụng chính xác cùng một mẫu để gửi email.

Tôi đã dựa trên email này vì tôi đã sử dụng các email duy nhất, nhưng có thể hợp lý hơn khi dựa trên tên người dùng vì nó được xác định là duy nhất bởi đăng ký django.