首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法分配"abc@gmail.com“。"Invitation.friend“必须是”邀请“实例

无法分配"abc@gmail.com“。"Invitation.friend“必须是”邀请“实例
EN

Stack Overflow用户
提问于 2017-03-19 07:44:28
回答 1查看 103关注 0票数 1

我正在制定一个转诊计划。它是指一位朋友加入我们的社区。我有个叫邀请的模特。我用了两种同样型号的表格。在第一个表单中,用户必须填写他/她的电子邮件地址。当他请求邀请时,他/她现在可以向他/她的朋友求助。如果被推荐的朋友点击他发送的参考链接,就会得到这个点。

我的第一份表格,即邀请请求正在生效,但当他/她请求邀请后,如果他/她试图引用填写他/她的电子邮件地址和他/她朋友的电子邮件地址的朋友,我会收到一个错误

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

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

这是我的models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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('/')

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

更新

就像我说过的,邀请模型由两种形式使用。首先,RequestInvitation表单使用它,这样用户就可以请求邀请,并且只有该用户可以使用refer。所以当我提交表格时,如果我做了Invitation.objects.create(email=sender_email, friend=reciever_email),我就会得到

unique_constraint在invitation_invitation.email上的误差

。去处理我想做的事

代码语言:javascript
复制
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,那么它就能工作了。如果我请求邀请后去推荐信表格,然后填写推荐信表格,那么“朋友”字段是空的。

EN

回答 1

Stack Overflow用户

发布于 2017-03-19 08:14:14

当提交表单时,不要将其保存到db,将其设置为false,因此表示您有更多的事情要处理。

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

模型。

代码语言:javascript
复制
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'

表格

代码语言:javascript
复制
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

视图

代码语言:javascript
复制
from django.shortcuts import render

从.forms导入ReferForm从django.http导入HttpResponseRedirect从django.views.generic.edit导入FormView从.models导入邀请

代码语言:javascript
复制
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('/') 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42884154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档