2014-05-04 30 views
0

models.py與外鍵unique_together Django的提高驗證錯誤

class Follow(models.Model): 
date_time = models.DateTimeField(auto_now_add=True, blank=True, unique=False) 
user = models.ForeignKey(User) 
follower = models.ForeignKey(User, related_name="followers", unique=False) 

def __unicode__(self): 
    return '%s, %s' % (self.user.username, self.follower) 

class Meta: 
    unique_together = [("user", "follower")] 

view.py

def new_follow(request): 
if request.method == 'POST': 
    form = FollowForm(request.POST) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     if not hasattr(instance, 'user'): 
      instance.user = request.user 
      instance.save() 
      form.save_m2m() 
     return HttpResponseRedirect('/followers/' + request.user.username) 
    else: 
     new_follow() 
else: 
    form = FollowForm() 

args = {} 
args.update(csrf(request)) 
args['form'] = form 
variables = RequestContext(request, {'form': form}) 
return render_to_response('new_follow.html', variables) 

forms.py

class FollowForm(forms.ModelForm): 

class Meta: 
    model = Follow 
    exclude = ['user'] 

我得到這個錯誤已經存在於數據庫中我該如何解決這個問題?另一方面,在管理面板中正確提出錯誤。

IntegrityError at /follow/ 
columns user_id, follower_id are not unique 

Request Method: POST 
Django Version: 1.6 
Exception Type: IntegrityError 
Exception Value:  
columns user_id, follower_id are not unique 
+1

沒關係,當你發現這個錯誤時,你應該告訴用戶他已經跟隨某人,所以不能做這個動作。 – iMom0

+0

你能幫我怎麼做。對不起,我是django的新成員,實際上這是我的問題。如何提高驗證錯誤 – kostas1987

回答

0

也許最簡單的方式來解決你的代碼是設置用戶模型實例之前調用is_valid()方法。但是,您可以嘗試通過手動校準validate_unique

... 
    instance = form.save(commit=False) 
    if not hasattr(instance, 'user'): 
     instance.user = request.user 
     try: 
      instance.validate_unique() 
      instance.save()    
      form.save_m2m() 
      return HttpResponseRedirect('/followers/' + request.user.username) 

     except ValidationError, e: #<---- Capturing validate unique exception 
            #  and append error to form error dict 
      form._errors = {} 
      for _, v in e.message_dict.items(): 
       form._errors.setdefault(NON_FIELD_ERRORS, []).extend( v ) 

聲明,未經測試。 PE:檢查你的代碼,只有在沒有通知用戶的情況下才有意義保存實例。

+0

非常感謝。 – kostas1987