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

Posted

技术标签:

【中文标题】Django:检查实例是不是存在于用户数据库中并保存到应用模型数据库【英文标题】:Django: Check instance if it exists in User Database and save to App Model DatabaseDjango:检查实例是否存在于用户数据库中并保存到应用模型数据库 【发布时间】:2016-08-08 19:13:41 【问题描述】:

我在我的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/')

【问题讨论】:

define: "问题是 get_directreferral 和 get_indirectreferral 都不起作用" 您的问题不够清楚。但我猜你想要的是将if self.cleaned_data['referrer'] in User.objects.all(): 替换为if User.objects.filter(username=self.cleaned_data['referrer']).exists() @e4c5 on clean_username 当用户注册时,用户在 Django Admin 中被添加到用户,但它没有添加到我的模型中。 感谢您的澄清,但恐怕它并没有让事情变得更清楚。当您说添加到模型时,您的意思是模型实例的记录不会出现在数据库中吗? @e4c5 模型实例出现在数据库中,但问题是当用户成功注册时,只有用户名保存在用户数据库中。我想要的是将用户名和推荐人都添加到 DirectReferral 和 IndirectReferral 数据库。 【参考方案1】:

我认为问题出在这里

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()

【讨论】:

【参考方案2】:

这是你需要的:

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

【讨论】:

感谢您。我确实基于此编辑了上面的代码,但仍然出现错误。 @ChrisTope 错误信息是什么?你能把同样的贴在这里吗? 检查上面的代码。我确实使用了您的代码,并对我的views.py 进行了一些修改。我在没有引用者的情况下尝试了它,并且在我的模型数据库中成功创建了用户名。但是当我添加引荐来源网址时,它出现了一些错误,例如 TypeError at /register/string indices must be integers 没关系。它现在正在工作。我刚刚删除了 self.cleaned_data['referrer'] 中的 ['referrer']。谢谢!

以上是关于Django:检查实例是不是存在于用户数据库中并保存到应用模型数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个元素是不是存在于 Django 查询集中?

检查图像是不是存在于 Django 模板中

如何检查我在 Django 中制作的模型中是不是存在用户?

检查表单输入是不是存在 [Django]

检查用户名是不是存在于数据库中

如何检查用户是不是存在于数据库php中