'IT 제품' 카테고리의 다른 글
갤럭시 S9 예상 조사 (2) | 2018.02.15 |
---|---|
아이패드 프로 조사 (0) | 2018.02.15 |
갤럭시 S9 예상 조사 (2) | 2018.02.15 |
---|---|
아이패드 프로 조사 (0) | 2018.02.15 |
갤럭시 S9이 2018년 2월 25일에 공개된다고 합니다. MWC 2018에서 공개된다고 하는데 DSLR 수준의 카메라를 탑재한다고 합니다.
현재 많은 언론이 예측 기사를 쏟아내고 있는데 그 중 가장 중요한 요소인 카메라와 안면인식, 그리고 디자인에 대해서 알아보겠습니다.
카메라의 조리개는 후면의 경우 F1.5 까지 내려간다고 합니다. F1.5면 상당히 낮은 수준의 F값으로 조리개가 많은 빛을 받아들이게 된다고 합니다.
그리고 슬로모션 기능도 상당히 강력하다고 합니다. 삼성전자가 자체 개발했다고 자랑하는 아이소셀을 이용한다고 하는데, 아이소셀이 1초에 1000프레임이상이나 촬영할 수 있게 해준다고 합니다. 30프레임이 자연스러운 동작이라고 했을 때 거의 30배 이상 뽑아낼 수 있다고 하는 것 아닌가 생각합니다. 1초 촬영하면 30초나 길게 뽑아낼 수 있다는 것인데, 누군진 모르지만 이 기능이 필요하다면 아주 유용하게 쓰실 수 있을 것입니다.
미드나잇 블랙을 원하신다면 미드나잇 써커스를 들으시며 참을성을 가져봅시다.
전면 화면 비율이 90%에 근접한다고 합니다. 화면이 크고 군더더기를 없애려고 노력했나봅니다.
3월 초에 예약판매를 시작한다고 합니다. 공개하고 금방 판매에 돌입해줍니다. 가격은 100만원 안팎이라고 합니다. 갤럭시 S8보다 비쌀 것이라고 합니다. 하지만 지금 2018년 02월 14일 기사에서 이렇게 말한 것이니 제대로 알아보시기 사시기 바랍니다.
이 블로그에서도 파트너스를 시작합니다. (0) | 2021.04.05 |
---|---|
아이패드 프로 조사 (0) | 2018.02.15 |
유튜브에서 아이패드 프로 광고가 나온다. 어떤 소년이 아이패드로 작업을 한다. 그림도 그리고 하여튼 뭔가 많이 한다. 그러고는 소년의 엄마로 보이는 사람이 질문한다.
"너 컴퓨터로 뭐하니?"
대답이 가관이다.
"컴퓨터가 뭔데요?"
컴퓨터는 아닌데 컴퓨터가 할 일을 하는 아이패드 프로를 리뷰해보겠다.
무게는 469g 밖에 안된다고 한다. 10.5인치 일 때 500g도 안된다는 것이다. 가벼워서 좋다. 혹여 12.9인치 모델이라고 하더라도 677g 밖에 안 된다. 역시 가볍다.
파이널컷 잘 쓰시는 분들은 아이패드로 작업하는 게 편할 것 같은 예감이 든다. 애플이 사진 작업, 그림 작업도 강조해서 자랑하니 그림이나 사진 관련해서 작업하시는 분들도 잘 쓰실 수 있을 것 같다. 가벼워서 연약한 사람들한테도 이로울 것 같다.
이 블로그에서도 파트너스를 시작합니다. (0) | 2021.04.05 |
---|---|
갤럭시 S9 예상 조사 (2) | 2018.02.15 |
이번엔 is_anonymous 와 is_authenticated 를 알아보겠습니다.
1 2 3 4 5 6 | if request.user.is_anonymous: pass # do something if user is logged out else: pass # do something if user is logged in | cs |
이렇게 사용될 수 있을 것입니다. 이번엔 templates 파일에서 어떻게 사용될지 알아봅시다.
1 2 3 | {% if user.is_anonymous %} <p>This user is logged out</p> {% endif %} | cs |
이렇게 사용될 수 있습니다. django의 강력한 기능인 템플릿파일의 템플릿 태그에서도 그대로 쓰인다는게 참 편리합니다.
is_authenticated는 위에서 살펴 본 is_anonymous와 반대된다고 생각하시면 됩니다. 저 코드와 반대로 로그인 여부를 묻는 것입니다. 만약 로그인 되어 있다면 이 코드는 True를 반환합니다. 그렇다면 이 코드가 views.py에서 어떻게 사용되는지 알아볼까요?
1 2 3 4 5 6 | if request.user.is_authenticated: pass # do something if user is logged in else: pass # do something if user is logged_out | cs |
이렇게 위와는 반대로 사용되게 됩니다. 그렇다면 템플릿 태그는 어떨지 알아보겠습니다.
1 2 3 | {% if user.is_authenticated %} <p>이 유저는 로그인 되어 있습니다.</p> {% endif %} | cs |
이렇게 사용되게 됩니다. 템플릿 태그를 이용하면 둘 중 하나만 알아도 대부분의 코드를 구현할 수 있을 것입니다.
1 2 3 4 5 | {% if user.is_authenticated %} <p>이 유저는 로그인 되어 있습니다.</p> {% else %} <p>이 유저는 로그아웃 되어 있습니다..</p> {% endif %} | cs |
이렇게 사용하면 위에서 {% if user.is_authenticated %}가 False를 반환하게 될 경우 {% else %}안의 코드가 실행됩니다. 그러므로 한 가지만 알면 두 가지 경우를 다 처리할 수 있습니다.
그렇다면 is_active는 어떨까요? 우선 템플릿 태그는 이렇게 쓸 수 있습니다.
1 2 3 4 5 | {% if user.is_active %} <p>이 유저는 활성화 되어 있습니다.</p> {% else %} <p>이 유저는 비활성화 되어 있습니다..</p> {% endif %} | cs |
is_active는 단순히 로그인, 로그아웃을 넘어서 그 유저의 현재 활동 가능 상태를 판단합니다. is_authenticated의 조금 더 발전된 버전입니다.
[ASGI] ASGI와 websocket 연결 설명 (0) | 2018.02.13 |
---|---|
[helloworld] for문 사용법 (0) | 2018.02.11 |
[django] django form 사용법 (0) | 2018.02.11 |
[django] django channels 사용법 (0) | 2018.02.10 |
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
ASGI 는 django-channels 를 사용할 때 알아야 하는 개념입니다. ASGI는 Asynchronous Server Gateway Interface 의 줄임말입니다. django-channels가 사용하고 있는 Daphne와 django-channels가 작동하는 기반입니다. ASGI는 WSGI와 비슷한 구조를 갖고 있으며 반드시 비동기 통신만을 지원하지는 않습니다.
ASGI : https://github.com/django/asgiref/blob/master/specs/asgi.rst
ASGI 어플리케이션은 스코프를 다루는 데에 사용됩니다. 스코프를 인자로 받게 됩니다. 스코프는 django-channels에서 하나의 연결 인스턴스이라고 설명할 수 있습니다. django-channels에서 하나의 연결이 이뤄지면 그 연결을 스코프 인스턴스라고 생각하고 진행하셔도 될 것 같습니다. 먼저 ASGI에서 사용하는 Application 클래스를 살펴보겠습니다.
1 2 3 4 | class Application: def __init__(self, scope): async def __call__(self, receive, send): | cs |
이 것이 Application 클래스입니다. 보시다시피 시작시에 scope 인자를 받습니다. scope를 전적으로 관리하는 것을 의미합니다. 그렇다면 이번엔 scope를 살펴보겠습니다. scope는 django의 Websocket 관련 문서에 설명이 나와있습니다.
django에서 scope설명 : https://github.com/django/asgiref/blob/master/specs/www.rst
여길 보시면 WebSocket 설명에서 Connection Scope에 대한 설명이 있습니다. 웹소켓 연결 스코프는 소켓이 살아있는 한 지속된다고 나와있습니다. 결국 스코프는 웹소켓 연결 인스턴스라는 뜻입니다. 스코프는 여러 메타데이터를 갖습니다. type, scheme, path, query_string, root_path, headers, client, server, subprotocols 등의 메타 데이터를 갖습니다. 자세한 설명은 위의 링크를 참조하시기 바랍니다.
1 2 | async def send(self, message): await self.base_send(message) |
이제 이 method의 의미를 알 수 있습니다. scope에서 message 인자를 send 한다는 것입니다. 그 이유는 send를 받는 클래스가 인스턴스로 스코프를 갖고 있기 때문입니다. 그래서 이 method가 가능한 것입니다.
[django] is_anonymous 와 is_authenticated 의 차이 (1) | 2018.02.15 |
---|---|
[helloworld] for문 사용법 (0) | 2018.02.11 |
[django] django form 사용법 (0) | 2018.02.11 |
[django] django channels 사용법 (0) | 2018.02.10 |
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
jQuery UI는 jQuery를 이용해서 웹에서 필요한 동적인 움직임들을 구현하기 쉽게 만들어놓은 소스 창고와도 같습니다. 인터넷에서 단순하지만 동적으로 보이는 동작들은 실제로 구현하기에 굉장히 많은 노력이 필요합니다. 그러나 jQuery UI를 사용한다면 여러가지 동적인 기능들을 쉽게 쓸 수 있습니다. 부트스트랩과도 비슷한 역할입니다.
jQuery UI : https://jqueryui.com/
에서 확인할 수 있습니다. jQuery 처럼 다운받아서 사용할 수도 있고 CDN으로 사용할 수도 있습니다.
홈페이지에 들어가시면 종류별로 상세하게 설명되어 있습니다. 전 몇 가지만 살펴보도록 하겠습니다.
<script> $( function() { $( "#accord" ).accordion(); } ); </script> </head> <body> <div id="accord"> <h3>1번</h3> <div> <p> 1번 섹션입니다. </p> </div> <h3>2번</h3> <div> <p> 2번 섹션입니다. </p> </div> <h3>3번</h3> <div> <p> 3번 섹션입니다 </p> <ul> <li>아이템1</li> <li>아이템2</li> </ul> </div> </div> </body> | cs |
조금 길지만 아코디언은 클릭하면 악기 아코디언처럼 늘어났다 줄어드는 동작을 말합니다.
그 다음은 jQuery로 동작할 수 있는 여러가지 effect에 대한 것입니다.
클래스를 더하거나 뺄 수 있습니다.
$( function() { $( "#btn" ).on( "click", function() { $( "#target" ).addClass( "got-class", 3000, callback ); }); function callback() { setTimeout(function() { $( "#target" ).removeClass( "got-class" ); }, 3000 ); } } ); | cs |
위 코드는 id값이 btn인 요소를 클릭하면 id값이 target인 요소에 got-class라는 클래스를 더하고 3초 후에 got-class라는 클래스를 제거하는 코드입니다. addClass의 두 번째 인자로 시간값을 지정해 줄 수 있습니다.
색깔 애니메이션도 jQueryUI를 이용해 할 수 있습니다.
$( function() { var value_save = true; $( "#btn" ).on( "click", function() { if ( value_save ) { $( "#target" ).animate({ backgroundColor: "#aa0000", }, 2000 ); } else { $( "#btn" ).animate({ backgroundColor: "#fffeee", }, 3000 ); } value_save = !value_save; }); } ); | cs |
#btn을 누르면 #target 에 animate 함수가 호출됩니다. 이 함수는 css 요소를 변경시킬 수 있습니다. 실제로 실행해보시면 #target의 css 요소가 변경됨을 알 수 있습니다. 전 backgroundColor 만을 변경시켰습니다. 그러나 너무 빠른 변경을 피하기 위해 시간 인자를 2000과 3000으로 주어서 그 시간동안 변경되게 했습니다. 마지막에 value_save 요소를 true와 false로 값을 다르게 함으로써 같은 애니메이션의 반복을 피합니다.
$( function() { $( "#btn" ).on( "click", function() { $( "#target" ).toggleClass( "got-class", 2000 ); }); } ); | cs |
#btn을 누르면 #target의 클래스가 변합니다. 만약 'got-class' 클래스가 있다면 'got-class' 클래스가 제거되고 'got-class' 클래스가 없다면 'got-class' 클래스가 부여됩니다.
[jQuery] ajax 통신 예제 (0) | 2018.02.11 |
---|---|
[jQuery] jQuery 설치 (0) | 2018.02.11 |
ajax는 Asynchronous JavaScript and XML의 줄임말로 비동기통신을 의미합니다.
ajax Wikipedia : https://ko.wikipedia.org/wiki/Ajax
예를 들어 설명하겠습니다. 무언가를 form에서 post요청으로 서버에 보내는 작업을 생각해 보겠습니다. ajax가 없다면 post요청 후에 서버로부터 데이터를 받아 브라우저의 화면이나 상태가 변할 것입니다. 이렇게 되면 최근 인터넷에서 좋아요 버튼을 누르더라도 화면이 변경되거나 필요하지 않은 새로고침 효과까지 사용자가 경험하게 됩니다. 하지만 많은 인터넷 페이지에서 그런 경우가 발생한다면 사람들이 많이 실망할 것입니다.
이런 경우 ajax를 사용하면 다른 브라우저 구성요소의 변동 없이 서버와 통신할 수 있습니다. 좋아요 버튼을 누르더라도 누른 버튼만 변경될 뿐 브라우저 전체의 변동은 없게 되는 것입니다. 물론 iframe등의 방법을 통해서도 이런 동작을 가능하게 할 순 있습니다. 하지만 ajax가 주는 안정성과 편리성은 따라갈 수 없습니다.
ajax통신을 하기 위해선 javascript만으로도 가능할 것입니다. 그러나 jQuery는 ajax통신을 획기적으로 편하게 해줍니다.
저는 jQuery를 이용한 ajax를 구현해 보겠습니다.
$("#submitBtn").click(function () { var getText = $("#submitTextarea").val(); $.ajax({ url:"/someurl/", type:"post", data:{ c : getText, }, dataType:"json", cache : false, success : function (data) { $.each(data, function (index, value) { do something }); } }); }); | cs |
위 코드는 id 값이 submitBtn 인 버튼을 클릭했을 시에 ajax 통신이 발생하도록 만든 코드입니다.
클릭이 발생하면 id 값이 submitTextarea인 Textarea로부터 값을 가져옵니다. val(); 은 jQuery에서 제공하는 값을 가져오는 함수입니다.
그 다음 ajax 통신이 발생합니다. $.ajax 이 부분입니다. jQuery는 이런식으로 ajax를 호출합니다. 그 후 인자별로 설명해보겠습니다.
1. 먼저 url입니다. url에는 현재 호스트 주소에 url에 전달된 값을 붙여 서버의 어떤 url 담당 부분과 통신하게 될지 결정합니다.
저같은 경우는 example.com/someurl/과 통신하게 될 것입니다.
2. 그 다음 type입니다. http 통신의 타입인 get, post 중 post를 사용한다고 생각하시면 됩니다.
3. data입니다. data는 request.POST에 dict 형식으로 전송됩니다. 서버에서 request body에서 데이터를 가져오게 하고 싶을 때 설정하시면 됩니다.
4. dataType입니다. 서버로부터 받게 될 데이터의 타입을 결정합니다. json 말고도 html 타입을 사용할 수 있습니다.
5. cache는 통신후 캐시할지에 대한 여부입니다. false로 하겠습니다. true일 경우 다른 통신에 지장을 주기도 하는 것 같았습니다.
6. success입니다. 통신이 성공한 후 처리하게 되는 부분입니다. function 의 인자인 data는 서버로부터 받게 되는 데이터를 의미합니다. 물론 data_get 같이 이름을 변경해도 상관 없습니다.
7. $.each() 함수는 jQuery에서 json 같은 데이터를 다룰 때 유용하게 쓰입니다. for문 대용으로 편리하게 인덱스의 수만큼 작업을 하게 도와줍니다.
이상으로 ajax에 대해 알아보았습니다. 요즘같이 동적인 웹을 필요로 할 땐 ajax가 아주 유용하게 사용됩니다.
[jQuery UI] jQuery UI 소개 및 예제 (0) | 2018.02.12 |
---|---|
[jQuery] jQuery 설치 (0) | 2018.02.11 |
jQuery는 javascript를 브라우저에서 편리하게 사용할 수 있게 도와줍니다. javascript는 그 자체로 브라우저안에서 역동적으로 동작하지만 jQuery를 이용하면 복잡한 코드를 매우 간편하게 이용할 수 있습니다.
jQuery : https://jquery.com/
jQuery Download : http://jquery.com/download/
여기선 jQuery를 파일 형태로 다운받을 수 있습니다.
jQuery CDN : https://code.jquery.com/
여기에 들어가면 여러가지 버전의 CDN이 제공됩니다. 만약 jQuery 1.12.4 버전을 CDN 형태로 이용하고자 한다면 다음을 html 파일 내에 작성합니다.
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script> | cs |
이렇게 html 파일 안에 작성한다면 그 다음부턴 html파일에서 다음과 같이 사용할 수 있습니다.
<script> $(document).ready(function () { $('#btn').click(function () { var text = $('#textarea').val(); $.ajax({ url:'/someurl/', type:'post', dataType:'json', cache:false, data:{ }, success:function (data) { console.log('success!') } }); }); }); </script> | cs |
<script></script> 처럼 script 태그 안에서 얼마든지 이용할 수 있게 됩니다.
<script> $(document).ready(function () { }); </script> | cs |
이 부분은 문서의 로드가 완료되어 준비가 된다면 중괄호 안의 코드를 실행한다는 뜻입니다. 문서가 로드되지도 않았을 때 코드가 실행된다면 예기치 못한 오류를 발생할 수 있을 때 사용합니다. 반드시 사용해야만 하는 코드는 아닙니다.
console.log('success!') 이 코드는 javascript의 브라우저 콘솔에서 메시지를 출력하는 코드입니다. jQuery 코드와 javascript 코드는 자유롭게 연동되어 사용될 수 있습니다. 콘솔은 크롬의 경우 f12를 눌러 열리는 개발자 도구에서 콘솔 창을 의미합니다.
jQuery는 html의 id값이나 class값을 굉장히 편리하게 선택할 수 있게 도와줍니다.
다음과 같은 코드가 있다고 하겠습니다.
<div class="div_class" id="div_id">이건 div입니다.</div> | cs |
이 코드의 div를 선택하기 위해 자바스크립트에선 getElementById 나 getElementByClass 를 사용해야 했습니다. 그러나 jQuery는 아주 쉽게 할 수 있도록 해줍니다.
$(".div_class") $("#div_id") | cs |
이 두가지 jQuery 선택자는 모두 저 div를 지칭합니다. javascript를 사용할 때보다 훨씬 더 단순하고 쉽게 선택할 수 있게 도와줍니다.
나머지 javasciprt의 코드들도 jQuery를 선택한 후에 사용할 수 있으니 매우 쉽고 편리할 것입니다.
[jQuery UI] jQuery UI 소개 및 예제 (0) | 2018.02.12 |
---|---|
[jQuery] ajax 통신 예제 (0) | 2018.02.11 |
자세한 설명은 https://wikidocs.net/22 에서 찾으실 수 있습니다.
for문은 프로그래밍에서 매우 자주 쓰이는 문법입니다. 반복이 조건에 맞춰 이뤄지기 때문에 자주 쓰일 수 밖에 없습니다. 이번엔 for 문을 알아보도록 하겠습니다.
for something in some_list_tuple_wordarray: go something some method() | cs |
in 이후의 리스트, 튜플, 문자열이 for문의 내용을 반복할 횟수를 결정합니다. 만약 리스트의 요소가 30개라면 30번 for문을 반복하게 되는 것입니다.
django 에서 for 문은 어떻게 사용될지 알아보겠습니다.
제가 만약 사용되면 안되는 password의 리스트를 갖고 있다고 해보겠습니다.
BAN_PASSWORD = [ 'password', '123456', '1234567', '12345678', '123456789', '1234567890', '012345', '0123456', '01234567', '012345678', '0123456789', 'hello', '111111', 'aaaaaa' ] | cs |
이렇게 지정되어선 안되는 password 리스트를 만들었습니다. 그 후 request로 입력받은 password 중 무언가가 이와 일치한다면 금지시킬 것입니다. 그러면 다시 render를 return 하도록 하겠습니다.
파이썬의 유용한 도구인 리스트와 for문을 결합한 형태를 사용하겠습니다. 이 방법은 리스트 내포라고 불립니다.
[what_you_want_to_do for i in some_list_tuple_wordarray if condition] | cs |
리스트 내포는 for문을 통해 나온 결과를 즉시 리스트 형태로 구성합니다.
django 에서 써 보겠습니다.
match = [pswd for pswd in BAN_PASSWORD if pswd in password] if match is True: clue = {'message': 'it's banned password'} return render(request, 'create.html', {'clue': clue}) | cs |
이렇게 하시면 됩니다. 그러면 만약 비밀번호가 위에 있는 목록에 부합하면 다시 render하여 return하게 됩니다.
위에서 clue는 create.html 템플릿에서 사용하기 위해 임의로 지정한 값입니다.
[django] is_anonymous 와 is_authenticated 의 차이 (1) | 2018.02.15 |
---|---|
[ASGI] ASGI와 websocket 연결 설명 (0) | 2018.02.13 |
[django] django form 사용법 (0) | 2018.02.11 |
[django] django channels 사용법 (0) | 2018.02.10 |
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
django 에서는 form 이라는 편리한 도구를 제공합니다. models.py에서 작성한 모델을 바탕으로 템플릿 파일에서 models.py의 model에 맞게 폼을 형성해주는 것입니다. 물론 django에서 제공하기에 views.py에서도 연동하여 이용할 수 있습니다. 여러가지 귀찮은 검사를 django에게 맡길 수 있습니다. 그리고 복잡한 html 코드를 단순하게 줄여줍니다.
django form documentation : https://docs.djangoproject.com/en/2.0/topics/forms/
<form action="." method="post"> {% csrf_token %} <div> <label for="name">username:</label> <input type="text" id="name" /> </div> <div> <label for="mail">E-mail:</label> <input type="email" id="mail" /> </div> <div> <label for="password">password:</label> <textarea id="password"></textarea> </div> <div> <label for="password_confirm">password_confirm:</label> <textarea id="password_confirm"></textarea> </div> <div class="button"> <button type="submit">Submit</button> </div> </form> | cs |
하나의 입력 폼을 작성할 때 두 줄의 코드를 필요로 하게 됩니다.
이번엔 form을 사용했을 때의 코드입니다.
<form class="form-horizontal" method="post" action="."> {% csrf_token %} <div class="form-group"> <label class="control-label col-sm-2" for="id_username">Username(ID)</label> <div class="col-sm-10">{{ form.username }}</div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="id_email">Email</label> <div class="col-sm-10"> {{ form.email }} </div> </div> <div class="form-group"> <label class="control-label col-xs-2 col-sm-2" for="id_password">Password</label> <div class="col-sm-10"> {{ form.password }} </div> </div> <div class="form-group"> <label class="control-label col-xs-2 col-sm-2" for="id_password_confirm">Password</label> <div class="col-sm-10"> {{ form.password_confirm }} </div> </div> <div class="form-group"> <div class="col-xs-offset-5 col-sm-offset-5"> <button class="btn btn-default" type="submit">Create</button> </div> </div> </form> | cs |
얼핏 보면 더 코드가 증가한 것 같지만 부트스트랩을 이용하기 위해 들어간 코드들을 제외하면 훨씬 더 간결해졌음을 알 수 있습니다.
특히 하나의 입력 폼이 {{ form.email }} 처럼 짧아지게 됩니다. 코드의 재사용시에도 {{ form.email }} 같이 짧게 이용할 수 있으니 효율적입니다.
class User(AbstractUser): | cs |
이러므로 이번엔 AbstractUser를 살펴보겠습니다.
class AbstractUser(AbstractBaseUser, PermissionsMixin): username = models.CharField( _('username'), max_length=150, unique=True, ) email = models.EmailField(_('email address'), blank=True) | cs |
AbstractBaseUser 까지 살펴보면 이렇습니다.
@python_2_unicode_compatible class AbstractBaseUser(models.Model): password = models.CharField(_('password'), max_length=128) | cs |
결국 username과 email, password 까지 위에서 사용된 모든 필드를 찾을 수 있었습니다.
이 필드들이 바탕이 되어 forms.py에서 형성되게 됩니다. 각각 CharField와 EmailField가 사용되었습니다.
from django import forms from django.contrib.auth.models import User | cs |
그 다음에 필요한 폼을 작성하시면 됩니다.
class UserCreateForm(forms.ModelForm): username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control ', 'placeholder': 'Username'})) email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'email'})) password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'})) password_confirm = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password_confirm'})) class Meta: model = User fields = ['username', 'email', 'password'] | cs |
이렇게 작성했습니다. 위에서 언급한 것처럼 CharField와 EmailField가 그대로 사용되었습니다. widget은 html에서 어떤 입력창을 사용하는지를 결정합니다. 그 옆에 괄호 안의 'class', 'placeholder'는 그대로 html에서 반영되는 요소들입니다. 원하는대로 적용해주세요. 저는 부트스트랩을 이용중이니 'class'에 'form-control'을 추가해줬습니다.
views.py의 def create(request): 에서 이 form을 사용한다고 해 봅시다. 그렇게 되면 얼마나 편리한지 알 수 있게 됩니다.
def create(request): if request.method == 'POST': form = UserCreateForm(request.POST) username = form.data['username'] email = form.data['email'] password = form.data['password'] password_confirm = form.data['password_confirm'] if form.is_valid: pass else: form = UserCreateForm() return render(request, 'create.html', {'form': form}) | cs |
이게 다입니다. 폼은 request와 함께 views.py로 전송되는데 그 폼을 읽기 위해서 단지 form = UserCreateForm(request.POST) 이 한 줄이 필요합니다. 그 다음엔 form.is_valid 같은 유효성 검사도 django에서 다 지원해주니 원하시는 대로 사용하시면 됩니다.
[ASGI] ASGI와 websocket 연결 설명 (0) | 2018.02.13 |
---|---|
[helloworld] for문 사용법 (0) | 2018.02.11 |
[django] django channels 사용법 (0) | 2018.02.10 |
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
[django] django 에서 recaptcha 사용 (0) | 2018.02.05 |