无法分配"abc@gmail.com" 。 "Invitation.friend"必须是"Invitation"实例



我正在开发一个推荐计划。它是推荐一个朋友加入我们的社区。我有一个名为邀请的模型。我使用了两种具有相同模型的表单。在第一种表单中,用户只需使用他/她的电子邮件地址填写表单。当他请求邀请时,他/她现在可以参考他/她的朋友。如果被推荐的朋友点击他发送的推荐链接,就会获得积分。

我的第一个表格,即邀请请求有效,但是在请求邀请后,如果他/她试图提及填写其电子邮件地址和他/她朋友的电子邮件地址的朋友,我会收到错误

无法分配"abc@gmail.com"。"邀请好友"必须是 "邀请"实例。

如何将引用的电子邮件地址(朋友)保存到数据库?

这是我的 models.py

class Invitation(models.Model):
email = models.EmailField(unique=True, verbose_name=_("e-mail Address"))
friend = models.ForeignKey('self', related_name="referral", null=True, blank=True, on_delete=models.CASCADE)
invite_code = models.UUIDField(default=uuid.uuid4, unique=True)
points = models.PositiveIntegerField(default=0)
invite_accepted = models.BooleanField(verbose_name=_('invite accepted'), default=False)
request_approved = models.BooleanField(default=True, verbose_name=_('request accepted'))

forms.py

class ReferForm(forms.Form):
sender_email = forms.EmailField(label=_("Your email"), required=True)
receiver_email = forms.EmailField(label=_("To email"), required=True)
def save(self, sender_email, receiver_email):
print('email', sender_email, receiver_email)
new_join, created = Invitation.objects.get_or_create(email=sender_email)
print ('new_join is', new_join, created)
if created:
return True
return new_join

views.py

class ReferInvitation(FormView):
template_name = 'refer/refer.html'
form_class = ReferForm
def form_valid(self, form):
sender_email = form.cleaned_data.get('sender_email')
receiver_email = form.cleaned_data.get('receiver_email')
print ('sender_email', sender_email)
print ('friend', receiver_email)
refer_instance = form.save(sender_email, receiver_email)
print ('refer_instance', refer_instance)
refer_instance.friend = receiver_email
refer_instance.invite_code = get_invite_code()
refer_instance.save()
messages.success(self.request, 'You invited {0} successfully'.format(receiver_email))
return HttpResponseRedirect('/')

一个疑问:当他请求邀请时,发件人电子邮件已经保存到数据库中。我的方法有效吗?

更新

就像我说过的,邀请模型有两种形式。首先,请求邀请表单使用它,以便用户可以请求邀请,并且只有该用户才能使用引用表单。因此,在提交表单时,如果我这样做Invitation.objects.create(email=sender_email, friend=reciever_email)我会得到

invitation_invitation.email 上的unique_constraint错误

.为了处理我试图做的

def save(self, sender_email, receiver_email):
try:
invite_instance = Invitation.objects.get(email=sender_email)
except:
invite_instance = None
if invite_instance:
invite_instance.friend = receiver_email
return invite_instance
return Invitation.objects.create(email=sender_email, friend=receiver_email)  

这样,如果我直接去参考表格并填写sender_email并reciever_email那么它就可以了。如果我在请求邀请后转到推荐表格并填写推荐表格,那么朋友字段为空。

提交表单时,不要将其保存到数据库,将其设置为 false,因此表示您有更多事情想用它做。

这是一个可行的解决方案,主要变化是模型上使用的FK。

型。

class Invitation(models.Model):
email = models.EmailField(unique=True, verbose_name=("e-mail Address"))
friend = models.EmailField(unique=True, null=True) # this was just because I didn't have any model to tie the FK to'

形式

from django import forms
from .models import Invitation

class ReferForm(forms.Form):
sender_email = forms.EmailField(label=("Your email"), required=True)
receiver_email = forms.EmailField(label=("To email"), required=True)
def save(self, sender_email, receiver_email):
print('email', sender_email, receiver_email)
#add the friend=receiver_email param as part of the argument for saving the form
new_join, created = Invitation.objects.get_or_create(email=sender_email, friend=receiver_email)
print ('new_join is', new_join, created)
if created:
return True
return new_join

视图

from django.shortcuts import render

从 .Forms 导入参考表单 从 django.http 导入 HttpResponseRedirect from django.views.generic.edit import FormView 从 .型号导入邀请函

class ReferInvitation(FormView):
template_name = 'refer.html'
form_class = ReferForm
def form_valid(self, form):
sender_email = form.cleaned_data.get('sender_email')
receiver_email = form.cleaned_data.get('receiver_email')
print ('refer_instance', refer_instance)
#saving  and updating in the same view is not allowed in django which is why you were getting the first error
# moved the saving of the form to the db down, you can do every other thing before saving
form.save(sender_email, receiver_email)
return HttpResponseRedirect('/') 

最新更新