2017-09-09 27 views
0

使用Django/DRF-React-Redux項目。所以我想返回用戶登錄驗證的特定消息。如果憑證不匹配,它們會得到一個錯誤字符串,如果用戶處於不活動狀態,則會得到另一個錯誤字符串。Django Rest框架的ValidationError中的行中斷和呈現HTML

我想要做的是爲其中一條消息,我需要兩個換行符,另一個我想呈現HTML,因爲它應該包含一個電子郵件地址。任何我讀過的東西都不起作用。例如,對於HTML:

Put HTML into ValidationError in Django

這裏是方法:

def validate(self, data): 
    username = data['username'] 
    password = data['password'] 
    user_qs = User.objects.filter(username__iexact=username) 
    # user_b = User.objects.filter(email__iexact=username) 
    # user_qs = (user_a | user_b).distinct() 
    if user_qs.exists() and user_qs.count() == 1: 
     user_obj = user_qs.first() 
     password_passes = user_obj.check_password(password) 
     if not user_obj.is_active: 
      raise ValidationError((mark_safe('This user is inactive. Please contact The Company at <a href="mailto:[email protected]?subject=Inactive Account">[email protected]</a>.'))) 
     if password_passes: 
      data['username'] = user_obj.username 
      payload = jwt_payload_handler(user_obj) 
      token = jwt_encode_handler(payload) 
      data['token'] = token 
      return data 
    raise ValidationError('The credentials provided are invalid.\nPlease verify the username and password are correct.') 

不用說,這是不渲染的前端如預期。不打破線條,不呈現HTML,只是將其顯示爲鍵入。

我猜如果一切都失敗了,我可以簡化服務器對「無效」或「無效」的響應,並只顯示完整的消息客戶端。

+0

檢查是否它返回一個陣列,使得在客戶端側,你可能需要做錯誤[0] – dkarchmer

+0

DRF究竟返回什麼?也許這個問題是不是在Django,但在js – serg

+0

@dkarchmer雙檢查,是的,我需要添加數組索引。雖然它在控制檯中使用幾個換行符正確呈現,但它不會在前端呈現。所以看起來塞爾格的建議可能也是對的。 React正在做一些事情。 – sockpuppet

回答

0

那麼,我最終遇到了:dangerouslySetInnerHTML照顧到這個問題。

https://facebook.github.io/react/docs/dom-elements.html#dangerouslysetinnerhtml

我改變了DRF串行以下。

def validate(self, data): 
    username = data['username'] 
    password = data['password'] 
    user_qs = User.objects.filter(username__iexact=username) 
    # user_b = User.objects.filter(email__iexact=username) 
    # user_qs = (user_a | user_b).distinct() 
    if user_qs.exists() and user_qs.count() == 1: 
     user_obj = user_qs.first() 
     password_passes = user_obj.check_password(password) 
     if not user_obj.is_active: 
      raise ValidationError(mark_safe('This user is inactive.<br><br>Please contact The Company at <a href="mailto:[email protected]?subject=Inactive Account">[email protected]</a>.')) 
     if password_passes: 
      data['username'] = user_obj.username 
      payload = jwt_payload_handler(user_obj) 
      token = jwt_encode_handler(payload) 
      data['token'] = token 
      return data 
    raise ValidationError(mark_safe('The credentials provided are invalid.<br><br>Please verify the username and password are correct.')) 

然後在陣營FE我不得不的signin.js容器從改變:

renderAlert() { 
    if (this.props.errorMessage) { 
     return (
      <div className="alert alert-danger"> 
       {this.props.errorMessage} 
      </div> 
     ); 
    } 
} 

到:

renderAlert() { 
    if (this.props.errorMessage) { 
     return (
      <div className="alert alert-danger" 
       dangerouslySetInnerHTML={{__html: this.props.errorMessage}}> 
      </div> 
     ); 
    } 
}