MFV based index‐CRUD standard guide - pai-plznw4me/django-initializer GitHub Wiki
예시)
- App Name : Project
- Model Name : Project
- Sub Model Name : ProjectFile
URLConf | Model | Form | View | Templates |
---|---|---|---|---|
create | Project | ProjectCreateForm | create | standard/create.html |
detail | Project | ProjectDetailForm | detail | standard/detail.html |
update | Project | ProjectUpdateForm | update | standard/update.html |
delete | Project | delete | standard/delete.html | |
Projectfile/create | ProjectFile | ProjectFileCreateForm | projectfile_create | standard/create.html |
Projectfile/detail | ProjectFile | ProjectFileDetailForm | projectfile_detail | standard/detail.html |
Projectfile/update | ProjectFile | ProjectFileUpdateForm | projectfile_update | standard/update.html |
Projectfile/Delete | ProjectFile |
crud.mov
-
표준 생성 가이드
Model Form View 생성시 표 표준 생성 가이드
{Model} 모델 이름 : ex Project {model} 모델 이름 소문자 : project
from django.db import models
# Create your models here.
from django.db import models
class Project(models.Model):
# 프로젝트 이름
name = models.CharField(max_length=100)
# 프로젝트 별명
alias = models.CharField(max_length=100)
# 프로젝트 아이디(고유)
id = models.CharField(max_length=20, primary_key=True)
# 프로젝트 시작 기간
start_date = models.DateField()
# 프로젝트 종료 기간
end_date = models.DateField()
def __str__(self):
return self.title
class ProjectCreationForm(forms.ModelForm): # <-- 표준 가이드에서 기본 생성되는 포맷은 {모델명}CreationForm 이다
class Meta:
model = Project
fields = ['id',
'name',
'alias',
'start_date',
'end_date']
widgets = {
'start_date': forms.widgets.DateInput(attrs={'type': 'date'}),
'end_date': forms.widgets.DateInput(attrs={'type': 'date'})
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class ProjectUpdateForm(forms.ModelForm):
class Meta:
model = Project
fields = ['id',
'name',
'alias',
'start_date',
'end_date']
widgets = {
'id': forms.widgets.DateInput(attrs={'readonly': 'readonly'}), #id 을 변경하지 못하게 합니다.
'start_date': forms.widgets.DateInput(attrs={'type': 'date'}),
'end_date': forms.widgets.DateInput(attrs={'type': 'date'})
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def create(request):
if request.method == 'POST':
form = ProjectCreationForm(request.POST, request.FILES) # <-- FILES 와 같이 입력이 되어야 한다.
if form.is_valid():
inst = form.save(commit=False)
inst.save()
return redirect(to='project:index')
else:
return render(request, template_name='project/create.html', context={'form': form})
elif request.method == 'GET':
form = ProjectCreationForm() # <-- FILES 와 같이 입력이 되어야 한다.
return render(request, template_name='project/create.html', context={'form': form})
def create(request):
if request.method == 'POST':
form = {Modelname}CreationForm(request.POST, request.FILES) # <--
if form.is_valid():
inst = form.save(commit=False)
# inst 작업
inst.save()
return redirect(to='project:index')
elif request.method == 'GET':
form = {Modelname}CreationForm() # <-- FILES 와 같이 입력이 되어야 한다.
return render(request, template_name='{Modelname}/create.html', context={'form': form})
- Read 는 특별하게
read
라고 하지 않고index
라고 명명
def index(request):
projects = Project.objects.all()
if projects:
# 테이블 내 instance 존재 시 아래 코드 수행
project_df = pd.DataFrame.from_records(projects.values())
full_url = request.build_absolute_uri()
# get url
parsed_url = urlparse(full_url)
base_url = parsed_url.scheme + "://" + parsed_url.netloc
# generate update urls,
url_path = 'project/update'.format()
url = os.path.join(base_url, url_path)
project_df['update'] = project_df.id.map(
lambda x: '<button onclick="location.href=\'{}/{}\'">update</button>'.format(url, x))
# delete button
url_path = 'project/delete'.format()
url = os.path.join(base_url, url_path)
project_df['delete'] = project_df.id.map(
lambda x: '<button onclick="location.href=\'{}/{}\'">delete</button>'.format(url, x))
table_html = project_df.to_html(escape=False)
# doctris template 적용
base_html = render(request, template_name='doctris_base/base.html').content
base_soup = BeautifulSoup(base_html, 'html.parser')
# doctris content 에 table 삽입
target_tag = base_soup.find('div', class_='container-fluid')
target_tag.append(table_html)
else:
# 테이블이 하나도 존재하지 않으면 아래 코드 수행
project_df = pd.DataFrame(columns=ProjectCreationForm._meta.fields)
table_html = project_df.to_html(escape=False)
return HttpResponse(table_html)
def index(request):
projects = Project.objects.all()
# get url
full_url = request.build_absolute_uri()
base_url = get_base_url(full_url)
if projects: # 테이블 내 instance 존재 시 아래 코드 수행
project_df = pd.DataFrame.from_records(projects.values())
# generate update urls,
url = generate_url(base_url, 'project', 'update')
# dataframe update column 에 button tag 삽입, project/update/{id} 를 삽입
project_df['update'] = project_df.id.map(
lambda x: '<button onclick="location.href=\'{}/{}\'">update</button>'.format(url, x))
# delete button
url = generate_url(base_url, 'project', 'delete')
# dataframe update column 에 button tag 삽입, project/delete/{id} 를 삽입
project_df['delete'] = project_df.id.map(
lambda x: '<button onclick="location.href=\'{}/{}\'">delete</button>'.format(url, x))
else: # 테이블이 하나도 존재하지 않으면 아래 코드 수행
# db -> dataframe -> html table
project_df = pd.DataFrame(columns=ProjectCreationForm._meta.fields +
['update', 'delete'])
# df -> html
table_html = project_df.to_html(escape=False)
# html table -> bs4
base_html = render(request, template_name='doctris_base/base.html').content
base_soup = BeautifulSoup(base_html, 'html.parser')
# create button tag
url = generate_url(base_url, 'project', 'create')
button_tag = create_button(url, 'create')
# doctris content 에 table 삽입
target_tag = base_soup.find('div', class_='container-fluid')
target_tag.append(button_tag)
target_tag.append(table_html)
# render
return HttpResponse(base_soup.prettify(formatter=None))
def update(request, id):
project = Project.objects.get(id=id)
if request.method == 'GET':
form = ProjectCreationForm(instance=project)
return render(request, template_name='project/update.html', context={'form': form})
elif request.method == 'POST':
form = ProjectCreationForm(request.POST, instance=project)
if form.is_valid():
inst = form.save(commit=False)
# 필요한 코드를 추가
inst.save()
return redirect(to='project:index')
else:
raise NotImplementedError
def update(request, id):
project = Project.objects.get(id=id)
if request.method == 'GET':
form = ProjectUpdateForm(instance=project)
return render(request, template_name='project/update.html', context={'form': form})
elif request.method == 'POST':
form = ProjectUpdateForm(request.POST, instance=project)
if form.is_valid():
inst = form.save(commit=False)
# 필요한 코드를 추가
inst.save()
return redirect(to='project:index')
else:
raise NotImplementedError
def delete(request, id):
Project.objects.get(id=id).delete()
return redirect(to='project:index')