[uscript] 5장. script add 만들기
템플릿을 만들어보자.
url에서 정의한 add_submit의 이름으로 호출한다.
url(r'^add/submit/$', views.scripts_add, name='add_submit'),
{% url 'scripts:add_submit' %} 또는 add/submit으로 호출할수도 있다.
views.py 에서 아래 함수를 만든다.
django에서는 모델 정보를 매핑해서 form을 쉽게 만들수 있게 제공하고 있다.
CreateView를 import 하고 상속을 받아서 사용한다.
model에 우리가 작성한 모델을 매핑하고 보여줄 화면 템플릿을 지정한다.
from django.views.generic.edit import CreateView
class ScriptsCreate(CreateView):
model = Scripts
template_name = 'scripts/add.html'
add.html 파일에서 단순하게 form.as_p() 를 호출하면 알아서 화면을 보여주는데 화면이 별로 예쁘게 보이지 않는다면 직접 화면을 구성할 수 있다.
django에서 모델을 이용한 View를 만드는 샘플이다.
우리는 직접 화면을 구성을 해본다. html로 구성시 title, contents, taglist 를 추가한다.
이유는 Scripts 모델에 있는 필드와 일치시켜야 되기 때문이다.
FormView를 이용해서 작성할 수도있는데 다음에 구현을 해보도록 하겠다.
contents는 input 이 아닌 textarea를 했는데 Scripts 모델에 contents 를 TextField를 사용했기 때문에 textarea를 사용하였다. input type을 사용해도 상관은 없으나 데이터 저장시 text 필드를 사용하기 때문에 textarea를 사용해서 글자에 제한이 없는게 좋다.
django에서 TextField를 사용하여 form을 생성해도 기본적으로 textarea를 사용한다.
스크립트를 신규 작성하는 함수를 만들어보자.
일반 블로그와 다르게 내가 작성한 스크립트를 업로드하는 프로그램이라 title에 .sql 파일을 업로드하게 되어 있다. 그래서 add 에서 작성을 할때에도 제목에 .sql 이 없으면 제목 마지막에 붙이게 하였다.
login_required 함수는 데코레이터 함수로 로그인이 필요하다는 것이고 로그인이 안되어 있으면 login_url로 redirect를 한다.
login_url 변수를 만들어서 넘기면 내가 지정한 로그인 주소로 이동한다.
login_url = '/scripts/login/'
login_required 를 사용하려면 아래와 같이 decorators 에서 import를 해야한다.
from django.contrib.auth.decorators import login_required
로그인을 하였다면 화면에 입력한 title, content를 저장한다.
tag의 경우는 전체 태그리스트를 새로 만들기 위해 콤마(,)로 분리된 글을 tag object를 생성하여 작성한다.
여기서 처음보는 내용이 하나 나오는데 scripts.tag_set 이다.
Tag 클래서에서 scripts를 ManyToMany 필드로 정의하였는데, Scripts 클래스에서 tag 클래스를 역으로 찾아가려면 _set 을 이용해서 찾을 수 있다. 이 부분은 항상 작성할때도 한번씩 헷갈리게 하는 부분이다.
마지막으로 save() 함수를 호출하여 정보를 저장한다. 저장이 되면 전체리스트로 redirect 한다.
url에서 정의한 add_submit의 이름으로 호출한다.
url(r'^add/submit/$', views.scripts_add, name='add_submit'),
{% url 'scripts:add_submit' %} 또는 add/submit으로 호출할수도 있다.
views.py 에서 아래 함수를 만든다.
django에서는 모델 정보를 매핑해서 form을 쉽게 만들수 있게 제공하고 있다.
CreateView를 import 하고 상속을 받아서 사용한다.
model에 우리가 작성한 모델을 매핑하고 보여줄 화면 템플릿을 지정한다.
from django.views.generic.edit import CreateView
class ScriptsCreate(CreateView):
model = Scripts
template_name = 'scripts/add.html'
add.html 파일에서 단순하게 form.as_p() 를 호출하면 알아서 화면을 보여주는데 화면이 별로 예쁘게 보이지 않는다면 직접 화면을 구성할 수 있다.
django에서 모델을 이용한 View를 만드는 샘플이다.
# views.py from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.core.urlresolvers import reverse_lazy from myapp.models import Author class AuthorCreate(CreateView): model = Author fields = ['name'] class AuthorUpdate(UpdateView): model = Author fields = ['name'] class AuthorDelete(DeleteView): model = Author success_url = reverse_lazy('author-list')
우리는 직접 화면을 구성을 해본다. html로 구성시 title, contents, taglist 를 추가한다.
이유는 Scripts 모델에 있는 필드와 일치시켜야 되기 때문이다.
FormView를 이용해서 작성할 수도있는데 다음에 구현을 해보도록 하겠다.
contents는 input 이 아닌 textarea를 했는데 Scripts 모델에 contents 를 TextField를 사용했기 때문에 textarea를 사용하였다. input type을 사용해도 상관은 없으나 데이터 저장시 text 필드를 사용하기 때문에 textarea를 사용해서 글자에 제한이 없는게 좋다.
django에서 TextField를 사용하여 form을 생성해도 기본적으로 textarea를 사용한다.
<form action="{% url 'scripts:add_submit' %}" method="post" class="form-inline"> {% csrf_token %} <table class="table"> <tr> <td>Title</td> <td><input class="form-control" type="text" name="title" value="" /></td> </tr> <tr> <td>Contents</td> <td><textarea class="form-control" name="contents" rows="10" cols="100" style="width:95%"></textarea></td> </tr> <tr> <td>Tag</td> <td><input type="text" class="form-control" name="taglist" id="taglist" value="{{ taglist }}" /></td> </tr> </table> <button class="btn btn-default" type="submit"> <span class="glyphicon glyphicon-envelope" aria-hidden="true"></span> Send</button> <a class="btn btn-default" href="/scripts/"> <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> List</a> </form>
스크립트를 신규 작성하는 함수를 만들어보자.
일반 블로그와 다르게 내가 작성한 스크립트를 업로드하는 프로그램이라 title에 .sql 파일을 업로드하게 되어 있다. 그래서 add 에서 작성을 할때에도 제목에 .sql 이 없으면 제목 마지막에 붙이게 하였다.
view.py @login_required(login_url=login_url) def scripts_add(request): title = request.POST['title'] if not title.__contains__('.sql'): title = title + '.sql' scripts = Scripts( title=title, contents=request.POST['contents'], user=request.user) scripts.save() taglist = request.POST['taglist'].split(',') scripts.tag_set.clear() for tag in taglist: tag_item, dummy = Tag.objects.get_or_create(tag_title=tag.strip()) scripts.tag_set.add(tag_item) scripts.save() return HttpResponseRedirect('/scripts/')
login_required 함수는 데코레이터 함수로 로그인이 필요하다는 것이고 로그인이 안되어 있으면 login_url로 redirect를 한다.
login_url 변수를 만들어서 넘기면 내가 지정한 로그인 주소로 이동한다.
login_url = '/scripts/login/'
login_required 를 사용하려면 아래와 같이 decorators 에서 import를 해야한다.
from django.contrib.auth.decorators import login_required
로그인을 하였다면 화면에 입력한 title, content를 저장한다.
tag의 경우는 전체 태그리스트를 새로 만들기 위해 콤마(,)로 분리된 글을 tag object를 생성하여 작성한다.
여기서 처음보는 내용이 하나 나오는데 scripts.tag_set 이다.
Tag 클래서에서 scripts를 ManyToMany 필드로 정의하였는데, Scripts 클래스에서 tag 클래스를 역으로 찾아가려면 _set 을 이용해서 찾을 수 있다. 이 부분은 항상 작성할때도 한번씩 헷갈리게 하는 부분이다.
마지막으로 save() 함수를 호출하여 정보를 저장한다. 저장이 되면 전체리스트로 redirect 한다.
댓글
댓글 쓰기