file management system - pai-plznw4me/django-initializer GitHub Wiki
νΌλΈλ¦μμ΄μμ΄ νμ€ νμΌ κ΄λ¦¬ μμ€ν ν΄λΉ μμ€ν μ κΈ°λ°μΌλ‘ μ¬λ¬ κΈ°λ₯μ μΆκ° ν μ μλ€.
λ€λ₯Έ μμ€ν κ³Ό μ°λμ΄ κ°λ₯νλ€.
νμ¬ λ¬Έμμμ λ€λ£¨λ λ²μ μVanilla
λ²μ μ΄λ€.
- Ohter version
- File Management system (with ams)
- File Management system (with ams, project)
λμ λ
μ
: κ°λ°μ
λ¬Έμ λͺ©μ
: ν΄λΉ λ¬Έμμ λͺ©μ μ νμΌ κ΄λ¦¬ μμ€ν
μ κΈ°λ₯μ μ²μλΆν° ꡬνν΄ λ³Έλ€.
μ΄λ₯Ό ν΅ν΄ κ°λ°μλ νμΌ κ΄λ¦¬ μμ€ν
μ ꡬ쑰λ₯Ό μ΄ν΄νκ³
μΆκ° κΈ°λ₯ νμ₯ λ° λ€λ₯Έ μμ€ν
κ³Όμ μ°λ ν μ μλ λ₯λ ₯μ λ°°μνλ€.
- μ€λ³΅ νμΌ μ λ‘λ κ°λ₯
- νμΌ μ λ‘λ κΈ°λ₯ / νμΌ λ€μ΄λ‘λ κΈ°λ₯
- νμΌ κ΄λ¦¬λ₯Ό μν΄ νμν λ©ν μ 보 μΆμΆ λ° μ μ₯
- λ€μ€ κΆν, κΆν μ¬λΆμ λ°λ₯Έ λ€μ΄λ‘λ κΈ°λ₯(account management system μ°λ νμ)
- CRUD ꡬν
- Project μμ± ( ν΄λΉ ν¬μ€ν
μμλ
fms
) - app μμ±( ν΄λΉ ν¬μ€ν
μμλ
file
) -
project
URLConf
μapp url
λ±λ‘ - package install
-
Model
-Form
-Template
- View ν¨ν΄μΌλ‘ κ°λ° λ¨.
from django.db import models
from file.validators import validate_version_format
# Create your models here.
class File(models.Model):
# file content
filecontent = models.FileField()
# νμΌ μ΄λ¦
name = models.CharField(max_length=100)
# νμΌ μ€λͺ
desc = models.TextField(null=True, blank=True)
# νμΌ νμ₯μ
ext = models.CharField(max_length=10, null=True)
# νμΌ μ©λ
size = models.IntegerField()
# λ¬Έμ μ
λ‘λ μκ°
upload_datetime = models.DateTimeField(auto_now_add=True)
# λ¬Έμ μμ± μκ°, creation_date λ λ¬Έμλ₯Ό μ€μ μμ±ν μκ°
creation_date = models.DateField(null=True, blank=True)
# λ¬Έμ λ²μ
version = models.CharField(max_length=100, validators=[validate_version_format], null=True, blank=True)
- validator κ°λ° : λͺ¨λΈ μμ€μμμ μ ν¨μ±μ κ²μ¦νλ€
# file/validators.py
import re
from django.core.exceptions import ValidationError
def validate_version_format(value):
# "v.x.x.x"μ κ°μ νμμΈμ§ κ²μ¬
pattern = re.compile(r'^v\.\d+\.\d+\.\d+$')
if not pattern.match(value):
raise ValidationError('Invalid version format. Use "v.x.x.x" format.')
python manage.py makemigrations
python manage.py migrates
# fms/file/forms.py
from django import forms
from .models import File
class FileCreationForm(forms.ModelForm):
class Meta:
model = File
fields = ['filecontent',
'desc',
'creation_date',
'version']
widgets = {
'creation_date': forms.widgets.DateInput(attrs={'type': 'date'})
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Create your views here.
def create(request):
if request.method == 'POST':
form = FileCreationForm(request.POST, request.FILES) # <-- FILES μ κ°μ΄ μ
λ ₯μ΄ λμ΄μΌ νλ€.
if form.is_valid():
inst = form.save(commit=False)
# νμΌ μμ± μΆμΆ λ° μμ±
file = form.cleaned_data['filecontent']
file_ext = os.path.splitext(file.name)[1]
# μμ± μ 보 μ μ₯
inst.name = file.name
inst.size = file.size
inst.ext = file_ext
inst = form.save(commit=False)
# file field νμΌ μ μ₯
inst.filecontent.save(file.name, file)
# μΌλ° form data μ μ₯
inst.save()
return redirect(to='file:index')
else:
print('Errors:', form.errors)
return render(request, template_name='file/create.html', context={'form': form, 'errors': form.errors})
elif request.method == 'GET':
form = FileCreationForm() # <-- FILES μ κ°μ΄ μ
λ ₯μ΄ λμ΄μΌ νλ€.
return render(request, template_name='file/create.html', context={'form': form})
else:
raise NotImplementedError
return HttpResponse('200')
<h2>File System</h2>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">μ μ‘</button>
</form>
# fms/file/urls.py
from django.urls import path
from file.views import index, create
app_name='file'
urlpatterns = [
path('create/', create, name='create'),
]
- HTML μμ± μ½λλ₯Ό μ€μ§ Python μ νμ©νμ¬ μμ° ν©λλ€. λ°λ‘ HTML template κ° νμνμ§ μμ΅λλ€.
- μ΄ μ½λμ ν΅μ¬μ βοΈDBμ DataFrame μΌλ‘ λ³κ²½ ν ν DataFrame ννμμ ν
μ΄λΈ μ μ²λ¦¬λ₯Ό μννλ κ² μ
λλ€.
- Cell λ΄
<a>
tag μΆκ° - datetime field ν¬λ§·μ DataFrame μμ μ μ΄ν©λλ€.
- Cell λ΄
def index(request):
# λ°μ΄ν°λ² μ΄μ€μμ λͺ¨λ File κ°μ²΄λ₯Ό κ°μ Έμ΄
files = File.objects.all()
# λ°μ΄ν°λ² μ΄μ€λ‘λΆν° DataFrame μμ±
files_df = pd.DataFrame.from_records(files.values())
# νμν column μμλ‘ DataFrame μ΄μ μ ν
column_order = ['id', 'name', 'filecontent', 'desc', 'ext', 'size', 'upload_datetime', 'creation_date',
'version']
files_df = files_df.loc[:, column_order]
# νμΌ λ€μ΄λ‘λλ₯Ό μν URL 리μ€νΈ μμ±
urls = [file.filecontent.url for file in files]
# νμΌ μ΄λ¦μ ν΄λ¦νλ©΄ ν΄λΉ νμΌμ λ€μ΄λ‘λν μ μλ λ§ν¬λ‘ λ³ν
target_colname = 'name'
target_series = files_df.loc[:, target_colname]
url_tags = [wrap_with_tag(str(ele), tag_name='a', href=url) for ele, url in zip(target_series, urls)]
files_df.loc[:, target_colname] = url_tags
# μ
λ‘λ μκ°μ μνλ νμμΌλ‘ λ³ν
target_colname = 'upload_datetime'
files_df[target_colname] = files_df[target_colname].dt.strftime('%y:%m:%d %H:%M:%S')
# DataFrameμ HTMLλ‘ λ³ν
table_html = files_df.to_html(escape=False)
# HTML ν
νλ¦Ώ νμΌμ μ λ κ²½λ‘ κ°μ Έμ€κΈ°
abspath = get_template_path('file/bootstrap.html') # {app_name}/{templates μ΄λ¦}μ μ
λ ₯νλ©΄ μ λ κ²½λ‘λ‘ λ°ν
# BeautifulSoupλ‘ HTML ν
νλ¦Ώ νμΌμ μ½μ΄μ€κΈ°
base_soup = bs4_load(abspath)
# ν
νλ¦Ώμ DataFrameμ μ½μ
soup = insert_html_to_body(soup=base_soup, target=table_html)
# BeautifulSoup κ°μ²΄λ₯Ό HttpResponseλ‘ λ°ν
return HttpResponse(soup.prettify(formatter=None))