MFV based index‐CRUD standard guide - pai-plznw4me/django-initializer GitHub Wiki

MFV 기반 CRUD 표준 가이드

네이밍 규칙

예시)

  • 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

MFV(Model From View) PAI 표준 가이드

  • 표준 생성 가이드

    Model Form View 생성시 표 표준 생성 가이드

    {Model} 모델 이름 : ex Project {model} 모델 이름 소문자 : project

Model

Example

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

Form

Example

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)

CRUD 생성

Create

Example

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})

Skeleton

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 는 특별하게 read 라고 하지 않고 index 라고 명명

Example

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)

Skeleton

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))

Update

Example

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

Skeleton

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

Delete

def delete(request, id):
    Project.objects.get(id=id).delete()
    return redirect(to='project:index')
⚠️ **GitHub.com Fallback** ⚠️