【问题标题】:UNIQUE constraint failed: auth_user.username唯一约束失败:auth_user.username
【发布时间】:2016-12-24 13:18:38
【问题描述】:

我正在尝试将名和姓直接从 Facebook API 存储到用户身份验证模型(使用 FacebookProfile 模型扩展,包含 webpull、id 和 year_formed)

Models.py

class FacebookProfile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)


    id = models.PositiveIntegerField(primary_key = True)
    #name = models.CharField(max_length = 200, null = True)
    year_formed = models.PositiveIntegerField(default = 0)
    webpull= models.CharField(max_length =1000, null = True)

Views.py

if request.method == 'GET':
    print 'im here'

    return render(request, "logV2.html")
if request.method == "POST":
    first_name = request.POST.get('first_name')
    last_name = request.POST.get('last_name')
    print first_name, last_name

    facebook_user = FacebookUserForm(data=request.POST)
    facebook_profile = FacebookProfileForm()

    has_account = authenticate(first_name = first_name, last_name = last_name)

    if has_account:
        print 'this has account'
        login(request, has_account)
        return HttpResponseRedirect('/music/home/')
    else:
        id_ = request.POST.get('id')
        birthday = request.POST.get('year_formed')
        webpull = request.POST.get('webpull')

        if birthday == "undefined":
            print 'im emplty'   
            year_formed = random.randint(1993,1998)
        else:
            year_formed = re.findall(r"[0-9][0-9][0-9][0-9]$", birthday)[0]

        print id_, year_formed, webpull

        print facebook_user

        user = facebook_user.save()
        profile = facebook_profile.save(commit = False)
        profile.user = user
        profile.webpull = webpull
        profile.id = id_

        ## steal birtday fucntion from log 
        # move to new database facebook (neeed to change all artists to facebookprofile)
        profile.year_formed = year_formed
        profile.save()



        #authenticate user. then log him in.
        #user = authenticate(username = profile.user.username)
        now_has_account = authenticate(first_name = first_name, last_name = last_name)
        login(request, now_has_account)


        #profile.save()
        return HttpResponseRedirect('/music/home/')

在视图中,代码在user = facebook_user.save() 处停止

我尝试清除整个数据库,

还有

我从 html 收到的是一个包含 first_name、last_name、id、year_formed、webpull 的表单。数据可以很好地到达后端。

Forms.py

class FacebookUserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name')

class FacebookProfileForm(forms.ModelForm):
    class Meta:
        model = FacebookProfile
        fields = ('id', 'year_formed', 'webpull',)

我在验证什么 Auth_Backend.py

class OnlynameandsurnameAuth(ModelBackend):
    def authenticate(self, first_name = None, last_name = None):
        try:
            return User.objects.get(first_name = first_name, last_name = last_name)
        except:
            return None

那么 auth.py

admin.site.register(FacebookProfile)

后端认证 settings.py

AUTHENTICATION_BACKENDS = (
    # ... your other backends
    #'music.auth_backend.PasswordlessAuthBackend',
    'music.auth_backend.OnlynameandsurnameAuth',
)

任何想法如何保存 first_name 和 last_name 而不会出现 UNIQUE 错误?

谢谢! :D

【问题讨论】:

    标签: python django facebook-graph-api


    【解决方案1】:

    如果您使用不提供密码的默认身份验证功能应该总是(?)失败,这意味着

    has_account = authenticate(first_name = first_name, last_name = last_name)
    

    总是无。

    但主要问题是您没有为新用户设置用户名,只有first_name和last_name。这将工作一次,但在创建一个用户名为空的用户后,下一次尝试将失败,因为用户需要一个唯一的用户名。 所以:添加用户名!

    除此之外,我认为

    user = facebook_user.save()
    

    不将用户分配给“用户”,而是分配给表单。 你应该使用 facebook_user.instance。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2016-01-10
      • 2019-01-02
      • 2019-04-28
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多