Django:检查实例是否存在于用户数据库中并保存到应用程序模型数据库

Django: Check instance if it exists in User Database and save to App Model Database

我在 forms.py

from django.contrib.auth.models import User
from .models import DirectReferral, IndirectReferral

class RegistrationForm(forms.Form):
    username = forms.RegexField()
    referrer = forms.CharField()

    def clean_username(self):
        try:
            user = User.objects.get(username__iexact=self.cleaned_data['username'])
        except User.DoesNotExist:
            return self.cleaned_data['username']
    raise forms.ValidationError(_("The username already exists."))

如何检查用户数据库中是否存在引用实例?

我做了下面的代码,但它有一个错误 TypeError at /register/

    def clean_referrer(self):
        try:
            user = User.objects.get(username__iexact=self.cleaned_data['referrer'])
        except User.DoesNotExist:
            raise forms.ValidationError(_("User does not exist."))
        return self.cleaned_data['referrer']

我也曾尝试这样做,但我收到 string indices must be integers 错误。

    def clean(self):
        if 'referrer' in self.cleaned_data:
            if User.objects.filter(username=self.cleaned_data['referrer']).exists():
                return self.cleaned_data['referrer']
            else:
                raise forms.ValidationError(_("Referrer doesn't exist!"))

这是我的 models.py

from django.contrib.auth.models import User

class DirectReferral(models.Model):
    name = models.OneToOneField(User, primary_key=True)
    referrer = models.ForeignKey(User, related_name="direct_referrals")

    def __str__(self):
        return self.name.username


class IndirectReferral(models.Model):
    name = models.OneToOneField(User, primary_key=True)
    referrer = models.ForeignKey(User, related_name="indirect_referrals")

    def __str__(self):
        return self.name.username

如何获取引用实例数据?
这是我的 views.py(更新)

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(
            username=form.cleaned_data['username']
            )

            ref_user = User.objects.get(
            username=form.cleaned_data['referrer'])

            direct = DirectReferral.objects.create(
                name = user,
                referrer = ref_user
            )

             if DirectReferral.objects.filter(referrer=user).exists():
                indirect = IndirectReferral.objects.create(
                    name = user,
                    referrer = ref_user
                )
            return HttpResponseRedirect('/register/success/')

我觉得问题出在这里

DirectReferral.name = username,
DirectReferral.referrer = referrer,
IndirectReferral.name = username,
IndirectReferral.referrer = referrer, 

您必须先创建对象,然后再像这样分配值:

direct_referal = DirectReferral()
direct_referal.name=....
....
direct_referal.save()

同样从您的代码来看,您似乎正在将字符串分配给用户对象:

DirectReferral.name = username

这里的用户名是字符串,DirectReferral.name是用户对象。您必须先获取此用户对象,然后再分配给推荐人的姓名。

direct_referal = DirectReferral()
direct_referal.name=User.objects.get(username=username)
....
direct_referal.save()

这是您需要的:

def register(request):
    if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        user = User.objects.create_user(
            username=form.cleaned_data['username'],
        )

        # Assuming form.cleaned_data['referrer'] has usernames. 
        # If it has pks then just use pk=form.cleaned_data['referrer']
        # You should wrap this in a try-except
        dr_user = User.objects.get(username=form.cleaned_data['referrer'])  
        direct_referral = DirectReferral.objects.create(
            user=user,
            referrer=dr_user,
        )

        # Wrap this in try-except as well.
        ir_user = dr_user.direct_referral.referrer
        indirect_referral = IndirectReferral.objects.create(
            user=user,
            referrer=ir_user,
        )
        return HttpResponseRedirect('/register/success/')

此外,这看起来像是 post_save 信号的工作。在这里查看它们:https://docs.djangoproject.com/es/1.9/ref/signals/#post-save