본 프로젝트의 user.views.UserView.as_view()를 호출하면 아래와 같은 응답을 받게 됩니다. user app의 test.py에 테스트 클래스 및 메서드를 적절히 작성하여
올바르게 회원가입이 완료되었을 때 “가입 완료!!”라는 문자열이 제대로 뜨는지 확인하는 테스트를 작성하세요.
➡️ user/urls.py 에서 userview에 해당하는 url_name을 만들어주고 reverse에 넣어서 경로를 읽어올 수 있게한다
➡️ response.data는 딕셔너리니까 key값인 message로 value를 불러와서 "가입완료!!"값이랑 비교한다
from django.urls import reverse
from rest_framework.test import APITestCase
class UserRegistrationTest(APITestCase):
def test_registration(self):
url = reverse('userview')
user_data = {
"username":"test",
"fullname":"테스터",
"email":"test@testuser.com",
"password":"password",
}
response = self.client.post(url,user_data)
self.assertEqual(response.data['message'],"가입 완료!!")
AssertionError: "${'email': [ErrorDetail(string='This fie[110 chars]')]}" != '가입 완료!!'
- ${'email': [ErrorDetail(string='This field is required.', code='required')], 'fullname': [ErrorDetail(string='This field is required.', code='required')]}
+ 가입 완료!!
이렇게 에러 메세지가 나왔다.
models.py에 보면 4가지 필드가 모두 빈칸 허용을 안해서 required field라고 하는 것 같다
*models.py의 REQUIRED_FIELDS = [] 이 부분이랑은 무관함
✔️fullname 필드를 blank=True 하면 "fullname":"", 또는 해당 필드 자체를 쓰지않아도 된다.
✔️근데 필드에 blank=True와 함께 null=True를 추가하면 NOT NULL constraint failed
라고 나오는데 이게 널값으로 저장되지 못하게 하는 거 아닌가?? ➜ 맞는데 이건 마이그레이션을 안해서 발생한 문제였다 모델에 변경이 생기면 무족권.. 마이그레이션을 하자!!!
✔️참고로 blank=True
는 사용자가 입력시 빈칸으로 둬도 된다는 뜻이고 null=True
는 DB에 저장될 때 NULL로 저장되는 것을 허용한다는 뜻
✔️그리고 USERNAME_FIELD = 'username'
이 부분은 인증할 때 저걸 쓰겠다는 말
git config --global core.autocrlf true
def solution(absolutes, signs):
answer=0
for abs,sign in zip(absolutes,signs):
if sign == False:
abs=abs*(-1)
answer+=abs
return answer
for i, j in enumerate(list)
이렇게 사용def solution(absolutes, signs):
return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))
<head></head>
사이에 <link rel="stylesheet" href="todolist.css" />
추가해서 css파일 추가function handleSingleClick(e) {
console.log("handleSingleClick")
console.log(e)
const singleItem = document.getElementById(e.id)
singleItem.classList.toggle('mystyle2')
}
.mystyle2{
text-decoration: line-through;
}
<div>
<input type="text" placeholder="값을 입력해주세요" id="input-value" />
<button onclick="addItem()">버튼</button>
</div>
function addItem() {
console.log('addItem 함수 실행중')
}
function addItem() {
const itemvalue = document.getElementById('input-value').value
console.log(itemvalue)
}
function addItem() {
const itemvalue = document.getElementById('input-value').value
const myList = document.getElementById('my-list')
// html에서 id=my-list인 요소를 선택
const newList = document.createElement('li')
// 리스트를 만든다
newList.innerText = itemvalue
myList.append(newList)
// newList를 myList에 붙인다
}
itemvalue.value = ''
const content = itemvalue.value
if (content) {
console.log('conetent o')
} else {
console.log('content x')
alert('값을 입력해주세요')
}
//리스트의 길이
console.log(myList.getElementsByTagName('li').length)
//리스트 번호
let list_number = myList.getElementsByTagName('li').length +1
//새로운 리스트 생성 및 속성 부여
const newList = document.createElement('li')
newList.innerText = content
newList.setAttribute("onclick","handleSingleClick(this)")
newList.setAttribute("id",'id-'+`${list_number}`)