私のシステムに紹介システムを実装したいのですが、登録ユーザーはドロップボックス1と同じように紹介リンク(つまり/ register / referral / 123123 /)をメールで送信して他の人を招待できます(人がサインアップすると、紹介者は追加のボーナスを受け取ります。現在、私はそれを次のように実装しています:モデル:
class UserReferral(models.Model):
STATUS_INVITED = 1
STATUS_ACCEPTED = 2
STATUS_EXPIRED = 3
STATUS_CHOICES = (
(STATUS_INVITED, 'Invited'),
(STATUS_ACCEPTED, 'Accepted'),
(STATUS_EXPIRED, 'Expired'),
)
referrer = models.ForeignKey(User, related_name='referrers')
referred = models.ForeignKey(User, related_name='referred')
number = models.IntegerField()
status = models.IntegerField(choices=STATUS_CHOICES, default=STATUS_INVITED)
class Meta:
unique_together = (('referrer', 'referred'),)
def __unicode__(self):
return 'User %s referred %s' % (self.referrer.get_full_name(), self.referred.get_full_name())
@property
def referral_expired(self):
expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
return (self.status == self.STATUS_ACCEPTED or
(self.referred.date_joined + expiration_date <= datetime_now()))
ビュー:このビューは、登録ユーザーが新しい紹介の招待状を送信するために使用します
@login_required
def invite_friends(request, template_name='accounts/invite_friends.html'):
if request.method == 'POST':
form = InviteForm(request.POST, user=request.user)
if form.is_valid():
emails = form.cleaned_data['emails']
for email in emails:
try:
user_referral = UserReferral.objects.get(referrer=request.user, referred__email=email)
except UserReferral.DoesNotExist:
random_username = ''.join(random.choice(string.ascii_uppercase) for x in range(6))
user = User.objects.create(username=random_username, password=email, is_active=False) # Dummy user to be overridden
user_referral = UserReferral.objects.create(referrer=request.user, referred=user, number=random.randint(10000, 99999))
send_mail('accounts/notifications/invite_friends', recipient_list=[email],
context={'user': request.user, 'number': user_referral.number})
messages.add_message(request, messages.SUCCESS, "Invites are sent.")
return redirect(reverse('profile_dashboard'))
else:
form = InviteForm(user=request.user)
return render(request, template_name, locals())
これは、紹介されたユーザーが登録できるURLであり、基本的に紹介コードを使用して元の登録関数を呼び出し、紹介コードが存在するかどうかを登録ビューで確認します。存在する場合は、紹介されたユーザーインスタンスをUserReferralインスタンスからフェッチしてデータを入力します。登録フォームからのユーザーデータとその新しいユーザーを保存します。
def referred_signup(request, referral_code):
user_referral = get_object_or_404(UserReferral, number=referral_code)
if user_referral.referral_expired:
raise Http404
response = register(request, referral_code=referral_code)
return response
そのため、新しい招待状が生成されるたびに、ダミーの非アクティブな「リファラー」ユーザーアカウントを作成します。そして、登録時にユーザー入力フォームから名前やパスワードなどを入力し、UserReferralインスタンスのステータスをACTIVATEDに変更します。これに代わるより良い方法はありますか?