2016년도 시작했으니깐. 

바빠서 작성하지 못했던 내용들을 정리해보려고 합니다.








이번 포스팅에서 정리해두려고 하는 것은 ModelForm 입니다. 

데이터베이스와 연관된 서비스를 만들 때 활용되는 것으로써 자세한 내용은 아래 URL에서 확인할 수 있습니다.

https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/


여기서는 urls.py / views.py / forms.py / models.py 소스코드 일부를 가지고 화면을 만들어보는 것을 목표로 했습니다. 



1. urls.py 


url을 관리하는 파일이죠.  소스는 아래와 같습니다. 


from django.conf import settings

from django.conf.urls import patterns, url

from django.conf.urls.static import static

from testModelForm.views import DataListView

from testModelForm.views import AddDataView


urlpatterns = patterns('',

url(r'^$',
DataListView.as_view(),
name='index'
),
url(r'^addData/$',
AddDataView.as_view(),
name='adddata'
),

) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

간단히 설명하면 2개의 url이 있구요. 하나는 testModel이고 하나는 testModel/addData 가 되겠습니다. 


2.views.py 
from django.contrib import messages
from django.views.generic.list import ListView
from django.views.generic.edit import FormView

from testModelForm.models import TestData
from testModelForm.forms import AddDataForm

class DataListView(ListView):
template_name = 'dataList.html'
model = TestData

def get_context_data(self, **kwargs):
context = super(DataListView, self).get_context_data(**kwargs)
context['dlist'] = self.model.objects.all()
return context

class AddDataView(FormView):
success_url = "/testModel"
template_name = 'addData.html'
form_class = AddDataForm

def form_valid(self, form):
sg = form.save()
print sg.__dict__

messages.info( self.request, "successfully added" )
return super(AddDataView, self).form_valid(form)

간단히 설명하면 2개의 view가 있고 DataListView는 List를 출력하는 view이고

AddDataView는 form을 출력하고 사용자가 form에서 submit 하면 그것을 처리하는 부분이 포함되어 있습니다.



3. forms.py


# -*- coding: utf-8 -*-

from django import forms
from testModelForm.models import TestData

class AddDataForm(forms.ModelForm):

class Meta:
model = TestData
fields = ('dName', 'dDescription', 'dLevel', 'dDate',)
widgets = {
'dName': forms.TextInput( attrs={'class': 'form-control',}),
'dDescription': forms.Textarea( attrs={'class': 'form-control',}),
'dLevel': forms.Select( attrs={'class': 'form-control',}),
'dDate': forms.DateInput( attrs={'class': 'form-control', 'readonly': True,}),
}
labels = {
'dName': "Name",
'dDescription': "Description",
'dLevel': "Level",
'dDate': "Date",
}

이것도 간단하게만.. TestData 클래스를 활용해서 form을 구성하는 내용입니다.



4. models.py


from django.db import models
from datetime import date

class TestData(models.Model):

LEVELS = [(x,str(x)) for x in range(1, 17)]

dName = models.CharField(max_length=30, default='data_name')
dDescription = models.CharField(max_length=300, default='data_description')
dLevel = models.IntegerField(choices=LEVELS, default=11)
dDate = models.DateField(auto_now=False, default=date.today)

class Meta:
ordering = ["-id"]

def __str__(self):
return self.dName

TestData  클래스의 Attribute는 데이터베이스 테이블의 column이라고 생각하면 편합니다.

4개의 column이 있고 아마도 기본적으로 id column이 데이터베이스에 생성됩니다.



5. addData.html


{% extends "base.html" %}

{% block content %}
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><p class="navbar-text" >TestModelForm</p></li>
<li><a href="/testModel" > Data List </a> </li>
<li class="active"><a href="/testModel/addData"> Add Data </a> </li>
</ul>
</div>
</div>
</nav>

<div class="container-fluid tab-pane fade in active row">
<div class="col-lg-12 col-md-12">
<div class="row">

<div class="col-md-5">
<form class="form-horizontal" style="margin:20px; width:100%;" action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-primary" style="width:100%; height:70px; margin-top:20px;" value="ADD" />
</form>
</div>
</div>
</div>
</div>


{% endblock %}

form을 출력하는 template 파일 중 일부



6. dataList.html


{% extends "base.html" %}

{% block content %}
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><p class="navbar-text" >TestModelForm</p> </li>
<li class="active"><a href="/testModelForm" > Data List </a> </li>
<li><a href="/testModel/addData"> Add Data </a> </li>
</ul>
</div>
</div>
</nav>

<section>
<table class="table table-striped">
<tr>
<td>No.</td>
<td>Name</td>
<td>Description</td>
<td>Level</td>
<td>Date</td>
</tr>

{% for dd in dlist %}
<tr>
<td> {{ dd.id }}</td>
<td> {{ dd.dName }}</td>
<td> {{ dd.dDescription }}</td>
<td> {{ dd.dLevel }}</td>
<td> {{ dd.dDate }}</td>
</tr>
{% endfor %}

</table>
</section>

{% endblock %}


저장된 데이터 목록을 출력하는 template 파일 중 일부



간단한 내용임에도 불구하고 길어졌네요.

모든 소스코드는 git에 올려뒀습니다. 

https://github.com/motobyus/deByMoto


결과도 살짝.








+ Recent posts