2016-12-24 107 views
2

我想的第一个名字和姓氏存储直接从Facebook的API的用户验证模型(这是扩展了FacebookProfile模型,包含webpull,ID和year_formed)UNIQUE约束失败:auth_user.username

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接收与名字,姓氏,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',) 

什么IM验证 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和姓氏不具有唯一的错误?

谢谢! :d

回答

1

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

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

永远是无(?)。

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

除此之外,我认为

user = facebook_user.save() 

不将用户分配到“用户”,但形式。 你应该使用facebook_user.instance。