[uscript] 6장. script update 만들기

이번에는 스크립트 업데이트 화면을 만들어본다.
스크립트를 작성하였다면 script id 값으로 데이터가 생성되었으므로 생성(add)과 다르게 id 값으로 수정화면으로 접근한다.

urls.py 에서 update 화면과 update submit 을 처리하는 view를 만든다.

url(r'^(?P<pk>\d+)/update/$', views.ScriptsUpdateView.as_view(), name='update'),
url(r'^(?P<scripts_id>\d+)/update/submit/$', views.scripts_update, name='update_submit'),

url에서 보면 update id 값으로 화면을 조회하고 submit을 할 수 있게 구성하였다.
수정화면은 작성화면과 동일하게 구성한다.

update.html 을 다음과 같이 작성한다.
add.html과 다른 점은 action에 url에 파라미터로 scripts.id가 들어간다.

<form action="{% url 'scripts:update_submit' scripts.id %}" method="post" class="form-inline">
{% csrf_token %}
<table class="table">
<tr>
<td>Title</td>
<td><input class="form-control" type="text" name="title" value="{{ scripts.title }}" /></td>
</tr>
<tr>
<td>Contents</td>
<td><textarea class="form-control" name="contents" rows="10" cols="100" style="width:95%">{{ scripts.contents }}</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-pencil" aria-hidden="true"></span> Edit</button>
<a class="btn btn-default" href="/scripts/{{ scripts.id }}/delete">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete</a>
<a class="btn btn-default" href="/scripts/">
<span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> List</a>
</form>

이번에는 views.py 에 함수를 추가하자.


class ScriptsUpdateView(generic.DetailView):
    model = Scripts
    template_name = 'scripts/update.html'

    def get_context_data(self, **kwargs):
        context = super(ScriptsUpdateView, self).get_context_data(**kwargs)
        taglist = self.object.tag_set.all()
        tag_string = ','.join(
            tag.tag_title for tag in self.object.tag_set.all()
        )
        context['taglist'] = tag_string
        return context

조회 화면은 DetailView로 구성하였다. add 함수와 차이는 tag 리스트가 이미 작성되어 있을수 있기 때문에 화면에서 태그리스트를 만들어서 화면에 보여줘야 한다.
class based 화면에 추가적으로 데이터를 넣을려면 context에 데이터를 추가해야 한다.
get_context_data 함수에 추가한다.

아래 함수를 호출해서 부모 기능을 그대로 상속받아서 context 객체를 얻어온다.

context = super(ScriptsUpdateView, self).get_context_data(**kwargs)

context에 dictionary 형태로 context['taglist'] = tag_string으로 추가하고 반환한다.

update 버튼을 클릭하면 submit을 호출하여 아래 함수를 호출한다.


@login_required(login_url=login_url)
def scripts_update(request, scripts_id):
    scripts = get_object_or_404(Scripts, id=scripts_id)
    scripts.title = request.POST['title']

    if not scripts.title.__contains__('.sql'):
        scripts.title = scripts.title + '.sql'

    scripts.contents = request.POST['contents']

    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(reverse('scripts:detail', args=(scripts_id,)))

add함수와 거의 동일한데 scripts_id로 Scripts 객체가 있는지 찾는다.
get_object_or_404가 있으면 객체를 반환하고 그렇지 않으면 404 에러를 발생시킨다.
get_object_or_404 는 아래와 같이 import를 해야한다.

from django.shortcuts import get_object_or_404

스크립트를 업데이트 한 후 reverse함수로 주소를 해석해서 redirect한다.
reverse함수는 url이름으로 주소를 찾는다.


댓글

이 블로그의 인기 게시물

dtsrun 실행하기

[MS SQL] SP수행 시간 및 작업빈도 확인

Slug가 뭘까?