Download - 2012 06 25
![Page 1: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/1.jpg)
20120625
![Page 2: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/2.jpg)
호떡의 장고 세미나 세 번째 시간
![Page 3: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/3.jpg)
지난 시간에 뭐 했더라 ?
![Page 4: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/4.jpg)
지난 시간에 뭐 했더라 ?
템플릿 필터 {{ 어쩌구 | 필터 1| 필터 2 }}
템플릿 태그 {% 여는태그 %} … {% 닫는태그 %}Models class Person(models.Model)
Admin /admin/
![Page 5: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/5.jpg)
Reusing templatesUsersForm
Today’s Topic
![Page 6: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/6.jpg)
int sum1 = 0;int sum2 = 0; int average1 = 0; int average2 = 0;
for (int i = 0; i < 4; i++) { sum1 += array1[i]; }average1 = sum1/4;
for (int i = 0; i < 4; i++) { sum2 += array2[i]; } average2 = sum2/4;
![Page 7: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/7.jpg)
int sum1 = 0;int sum2 = 0; int average1 = 0; int average2 = 0;
for (int i = 0; i < 4; i++) { sum1 += array1[i]; }average1 = sum1/4;
for (int i = 0; i < 4; i++) { sum2 += array2[i]; } average2 = sum2/4;
![Page 8: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/8.jpg)
코드의 중복
![Page 9: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/9.jpg)
묶어봅시다
![Page 10: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/10.jpg)
v
![Page 11: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/11.jpg)
![Page 12: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/12.jpg)
![Page 13: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/13.jpg)
v
Content !
![Page 14: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/14.jpg)
Outline
Content
..{% block content %}기본으로 보일 내용 ..{% endblock %}..
base.html
..{% extends “base.html” %}{% block content %}덮어쓸 내용 !{% endblock %}..
something.html
![Page 15: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/15.jpg)
![Page 16: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/16.jpg)
![Page 17: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/17.jpg)
Outline
Content
..<div class=‘title’>{% block title %}{% endblock %}</div>{% block content %}{% endblock %}..
base.html
{% extends “base.html” %}{% block title %}제목제목제목 {% endblock %}{% block content %}내용내용내용내용{% endblock %}something.html
Title
![Page 18: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/18.jpg)
Outline{% block title %}{% endblock %}{% block content %}{% endblock %}
base.html
Outline_Inner {% extends “base.html” %}{% block title %} 제목{% endblock %}{% block content %}... {% block inner_content %} {% endblock %}{% endblock %}
something.html
Title
Content
app/base.html {% extends “app/
base.html” %}{% block inner_content %}..{% endblock %}
![Page 19: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/19.jpg)
Forms
![Page 20: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/20.jpg)
덧셈 계산기
![Page 21: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/21.jpg)
~/tutorial $ python manage.py startapp calc
![Page 22: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/22.jpg)
~/tutorial $ vi templates/calc.html
<form method='POST' action='/calc/'> <input type="text" name="n1"> 더하기 <input type="text" name="n2"> <input type="submit" value=" 계산 "> {% if result %} 결과는 {{ result }} {% endif %}</form>
![Page 23: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/23.jpg)
~/tutorial $ vi calc/views.py
from django.shortcuts import renderdef calc(request): if request.method == 'GET': return render(request, 'calc.html') else: n1 = int(request.POST.get('n1', 0)) n2 = int(request.POST.get('n2', 0)) return render(request, 'calc.html', {'re-sult': n1+n2})
이제 INSTALLED_APPS, URL 설정들은 알아서
![Page 24: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/24.jpg)
![Page 25: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/25.jpg)
~/tutorial $ vi templates/calc.html
<form method='POST' action='/calc/'> <input type="text" name="n1"> 더하기 <input type="text" name="n2"> <input type="submit" value=" 계산 "> {% csrf_token %} {% if result %} 결과는 {{ result }} {% endif %}</form>
![Page 26: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/26.jpg)
![Page 27: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/27.jpg)
![Page 28: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/28.jpg)
~/tutorial $ vi calc/views.py
from django.shortcuts import renderdef calc(request): if request.method == 'GET': return render(request, 'calc.html') else: errors = [] try: n1 = int(request.POST.get('n1', 0)) n2 = int(request.POST.get('n2', 0)) result = n1 + n2 except ValueError: errors.append('Not a number!') result = 0
return render(request, 'calc.html', {'re-sult': result, 'errors': errors})
![Page 29: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/29.jpg)
~/tutorial $ vi templates/calc.html<form method='POST' action='/calc/'> <input type="text" name="n1"> 더하기 <input type="text" name="n2"> <input type="submit" value=" 계산 "> {% csrf_token %} {% for error in errors %} {{ error }} <br /> {% empty %} {% if result %} 결과는 {{ result }} {% endif %} {% endfor %}</form>
![Page 30: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/30.jpg)
실습 1 : 이준영 파이널
![Page 31: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/31.jpg)
더 알고싶은 사람을 위해…개인적으로는 추천하지 않습니다
… 쓰고싶으면 써보세요
![Page 32: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/32.jpg)
Users
![Page 33: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/33.jpg)
?
![Page 34: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/34.jpg)
![Page 35: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/35.jpg)
~/tutorial $ python manage.py shell>>> from django.contrib.auth.models import User>>> user = User.objects.create_user('rodumani', '[email protected]', 'bakwi')>>> user.save()>>>>>> user.is_staff = True>>> user.save()
유저 추가하기
![Page 36: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/36.jpg)
~/tutorial $ python manage.py shell>>> from django.contrib.auth import au-thenticate>>> authenticate(username='rodumani', password='logue')>>> authenticate(username='rodumani', password='bakwi')<User: rodumani>
ID/PW 확인하기
![Page 37: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/37.jpg)
실습 2 : Ahae 회원제로 바꾸기
![Page 38: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/38.jpg)
~/tutorial $ vi templates/login.html
<form method="POST" action="/ahae/login/"> ID <input type="text" name="username"> PW <input type="password" name="password"> <input type="submit"> {% csrf_token %}</form>
{{ error }}
![Page 39: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/39.jpg)
~/tutorial $ vi ahae/views.pyfrom django.shortcuts import redirectfrom django.contrib.auth import authenticate, logindef ahae_login(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, pass-word=password) if user is not None and user.is_active: login(request, user) return redirect('/ahae/13/') else: error = "Invalid login" return render(request, 'login.html', {'error': error}) return render(request, 'login.html')
![Page 40: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/40.jpg)
~/tutorial $ vi ahae/urls.pyurlpatterns = patterns('', url(r'^(\d+)/', 'ahae.views.print_ahae'), url(r'^login/$', 'ahae.views.ahae_login'),)
![Page 41: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/41.jpg)
Rodumani, 1212 를 입력하면…
Rodumani, bakwi 를 입력하면…
![Page 42: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/42.jpg)
~/tutorial $ vi ahae/views.pyfrom django.contrib.auth.decorators import login_required@login_required(login_url='/ahae/login/')def print_ahae(request, N): N = int(N) ...
def ahae_login(request): ... if user is not None and user.is_active: login(request, user) return redirect(request.POST['next']) else: ... return ... return render(request, 'login.html', {'next': re-quest.GET.get('next', '/ahae/13/')})
![Page 43: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/43.jpg)
~/tutorial $ vi templates/login.html<form method="POST" action="/ahae/login/"> ID <input type="text" name="username"> PW <input type="password" name="password"> <input type="submit"> <input type="hidden" name="next" value="{{ next }}"> {% csrf_token %}</form>
{{ error }}
![Page 44: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/44.jpg)
오늘은 여기까지 !
![Page 45: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/45.jpg)
미니 프로젝트
![Page 46: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/46.jpg)
• 주제 자유
• 3~4 인 1 팀 구성
• Trac, SVN 을 사용할 것
• 페이지 2 개 이상 , Model 2 가지 이상
사용
(Form 이 하나 이상 들어가도록 )• Admin 구현
• ~ 수요일 7 시까지
미니 프로젝트 !?
![Page 47: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/47.jpg)
팀 구성
/ 민정 지향 필립/ 종욱 중언 태현 / ( 박 ) 준성 재의 지혁/ 창원 정민 기훈
143.248.234.124 팀장 이름 ... SVN
![Page 48: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/48.jpg)
다음 예고 : 수요일 7 시
• 가급적 수요일 낮부터 만나서 마무리 작업을 할 것을 권장
• 수요일 7 시에 모여서 발표 , 평가 진행• 가장 잘 한 팀에게는 상품이…
![Page 49: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/49.jpg)
마지막 예고 : 금요일 9 시
• 그 동안 못 다룬 토픽들• Django Deployment Tips
![Page 50: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/50.jpg)
http://djangobook.com http://djangoproject.com
http://djangosnippet-s.org
![Page 51: 2012 06 25](https://reader036.vdocuments.mx/reader036/viewer/2022062310/56815ebc550346895dcd40b7/html5/thumbnails/51.jpg)
Hodduc@SPARCS