standard index - pai-plznw4me/django-initializer GitHub Wiki
1. manage.py ํ์ผ์ด ์๋ ํด๋ ๋ด `helper.py` ๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค.
2. templatetags
|- index.py
3. templates/standard
|-create.html
|-detail.html
|-update.html
-
ํ์ค ์ธ๋ฑ์ค
๋Target ๋ชจ๋ธ
record
ํญ๋ชฉ๋ค์ ๋ณด์ฌ์ฃผ๋Html Page
์ ๋ปํจ. - ํ์ค Index page ๋
standard_index()
์ ํตํด ์์ฑ๋ ์ฝ๋ ๋ฐ HTML ์ ์๋ฏธํ๋ค.
def standard_index(request, model, model_filter, form_class, url_path, base, crud_table, callback, **callback_kwargs):
added_contents = []
instances = model.objects.filter(**model_filter)
# url
full_url = request.build_absolute_uri()
base_url = get_base_url(full_url)
# crud standard table
crud_table_html = crud_table(base_url, instances, form_class._meta.fields, url_path)
added_contents.append(crud_table_html)
# callback
if callback:
callback(request=request, model=model, model_filter=model_filter, form_class=form_class, url_path=url_path,
base=base, instances=instances, crud_table_html=crud_table_html, added_contents=added_contents,
**callback_kwargs)
# render
ret_html = add_content(request, base, *added_contents)
return HttpResponse(ret_html)
def index(request):
return standard_index(request, File, {}, FileCreateForm, 'file', None,
generate_crud_filetable,
None)
:param request
: HttpRequest ๊ฐ์ฒด
:param model
: Django ๋ชจ๋ธ ํด๋์ค (์: Project)
:param model_filter
: ๋ชจ๋ธ ์ฟผ๋ฆฌ์
ํํฐ๋ง์ ์ํ ๋์
๋๋ฆฌ
:param form_class
: Django ํผ ํด๋์ค (์: ProjectCreateForm)
:param url_path
: ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋ URL ๊ฒฝ๋ก
:param base
: ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋ ๊ธฐ๋ณธ ํ
ํ๋ฆฟ ๊ฒฝ๋ก
:param crud_table
: CRUD ํ
์ด๋ธ ์์ฑ ํจ์
:param callback
: ์ ํ์ ์ธ ์ฝ๋ฐฑ ํจ์ (ํจ์ ๋๋ ๋ฉ์๋)
:param callback_kwargs
: ์ฝ๋ฐฑ ํจ์์ ์ ๋ฌํ ์ถ๊ฐ ํค์๋ ์ธ์๋ค
:return: HttpResponse
๊ฐ์ฒด
ํจ์๋ Django ๋ชจ๋ธ์ ๋ํ ํ์ค ์ธ๋ฑ์ค ๋ทฐ๋ฅผ ์์ฑํ๋ฉฐ CRUD ์์ ์ ํฌํจํฉ๋๋ค.
model
, model_filter
,form_class
, curd_table
4๊ฐ์ง ์ธ์์ **kwargs
์ CRUD ํ
์ด๋ธ
์ ์์ฑํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ table ์ helper.generate_crud_table
์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
def index(request):
return standard_index(request, File, {}, FileCreateForm, 'file', None,
generate_crud_filetable,
None)
helper.generate_crud_table
์ Model
๋ด Form
๋ด ์ ์๋์ด ์๋ field ์ table ํํ๋ก ๋ง๋ค์ด ๋ฐํํฉ๋๋ค.
๋ง์ฝ model_filter
๋ด key-value ๊ฐ ์ถ๊ฐ๋์ด ์๋ค๋ฉด filter ์ ์ํํด ์กฐ๊ฑด์ ๋ง๋ ์ ๋ณด๋ง์ ํ
์ด๋ธ๋ก ๋ง๋ค์ด ์ ๊ณตํฉ๋๋ค.
์ฝ๋ ์์ค์์ ์ด์ผ๊ธฐํ์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Model.objects.filter(key=value)
์์์ ๋ง๋ค์ด์ง ํ ์ด๋ธ์ create button , detail button , update button , delete button ์์ฑํด ์ถ๊ฐํฉ๋๋ค.

์ธ์ url_path
์ crud_table
function ์์ ์ฌ์ฉํ๋ ์ธ์๋ก์ create
, deatil
, update
, delete
button ์ url ์ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.(
url_path
์ค create
, update
, delete
, datail
๋ถ๋ถ์ ์ ์ธํ url_path ์ ์
๋ ฅํ๋ฉด ๋๋ค.
๊ฐ button ๋ณ url ์ ์๋์ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค. Create : {base_url}/{url_path}/create Update : {base_url}/{url_path}/update Delete : {base_url}/{url_path}/delete Detail(Read) : {base_url}/{url_path}/Detail
์ฌ์ฉ์ ๋ชฉ์ ์ ๋ง๊ฒ CRUD Table ๋ด๋ถ ๋ก์ง์ ์ถ๊ฐํด์ผ ํ ๋๊ฐ ์์ต๋๋ค.
์๋ฅผ๋ค์ด ๊ฐ๋ น ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์์ ์๋ ๋งํฌ๋ฅผ ๊ฑด๋ค๋๊ฐ ๋ง์ด์ฃ .
์ด๋ ์ฌ์ฉ์๋ ์์ ๋ง์ custom generate crud table
์ ์์ฑ ํ ์ ์์ต๋๋ค.
def fn(base_url, objects, field_names, url_path, **kwargs):
์ฌ์ฉ์๋ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ๋ฌ๊ฐ์ table ์ ๋ง๋ค์ด ์ ์ฉ ํ ์ ์์ต๋๋ค. ๊ฐ๋ น ๊ฐ์ฅ๊ธฐ๋ณธ์ ์ธ crud table ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
def generate_crud_table(base_url, objects, field_names, url_path, **kwargs):
field_names = field_names + ['detail', 'update', 'delete']
if objects: # ํ
์ด๋ธ ๋ด instance ์กด์ฌ ์ ์๋ ์ฝ๋ ์ํ
object_df = pd.DataFrame.from_records(objects.values())
# detail button (read)
append_onclick_button('detail', base_url, object_df, url_path)
# generate update urls, (update)
append_onclick_button('update', base_url, object_df, url_path)
# delete button (delete)
append_onclick_button('delete', base_url, object_df, url_path)
else: # ํ
์ด๋ธ์ด ํ๋๋ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ ์ฝ๋ ์ํ
object_df = pd.DataFrame(columns=field_names)
object_df = object_df.loc[:, field_names]
# df -> html
table_html = object_df.to_html(escape=False)
# create button
url = generate_url(base_url, os.path.join(url_path, 'create'))
button_tag = create_button(url, 'create')
crud_table = button_tag + table_html
return crud_table
์ฌ์ฉ์๋ ์ ์ฝ๋๋ฅผ ๋ณํํ์ฌ ๊ฐ์์ ๋ชฉ์ ์ ๋ง๋ crud table ์ ์์ฑํ ์ ์์ต๋๋ค. ์๋ ์์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ํ์ผ์ ๋ค์ด๋ก๋ ํ ์ ์๋ ๋งํฌ๊ฐ ๊ฐ์ด ์๋ table ์ ์์ฑํ๋ ์์ ์ ๋๋ค.
def generate_crud_filetable(base_url, objects, field_names, url_path, **kwargs):
"""
๋ค์ด๋ก๋ ๋งํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ๊ณต๋ ๊ฐ์ฒด์ ํ๋ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ CRUD ํ
์ด๋ธ์ HTML ํ์์ผ๋ก ์์ฑํฉ๋๋ค.
์์ฑ๋ table ๊ฐ์ฅ ์ค๋ฅธ์ชฝ field Detail, Update , Delete field ์ ์์ฑํ๊ณ button ์ ์์ฑํฉ๋๋ค.
+----------+
| create |
| <button> |
+--------+-------+----------+----------+----------+
| Object | Field | Detail | Update | Delete |
+--------+-------+----------+----------+----------+
| Object1| Field1| <button> | <button> | <button> |
| Object2| Field2| <button> | <button> | <button> |
+--------+-------+----------+----------+----------+
"""
target_column = kwargs['target_column'] #<-- ์ถ๊ฐ๋ ์ฝ๋
field_names = field_names + ['detail', 'update', 'delete']
if objects: # ํ
์ด๋ธ ๋ด instance ์กด์ฌ ์ ์๋ ์ฝ๋ ์ํ
# ํ์ผ ๋ค์ด๋ก๋๋ฅผ ์ํ URL ๋ฆฌ์คํธ ์์ฑ
urls = [file.filecontent.url for file in objects] #<-- ์ถ๊ฐ๋ ์ฝ๋
# filecontent column ์ ํ์ผ ๋ค์ด๋ก๋ ๋งํฌ ์์ฑ
object_df = pd.DataFrame.from_records(objects.values()) #<-- ์ถ๊ฐ๋ ์ฝ๋
target_series = object_df.loc[:, target_colname]#<-- ์ถ๊ฐ๋ ์ฝ๋
url_tags = [wrap_with_tag(str(ele), tag_name='a', href=url) for ele, url in zip(target_series, urls)]#<-- ์ถ๊ฐ๋ ์ฝ๋
object_df.loc[:, target_colname] = url_tags#<-- ์ถ๊ฐ๋ ์ฝ๋
# detail button (read)
append_onclick_button('detail', base_url, object_df, url_path)
# generate update urls, (update)
append_onclick_button('update', base_url, object_df, url_path)
# delete button (delete)
append_onclick_button('delete', base_url, object_df, url_path)
else: # ํ
์ด๋ธ์ด ํ๋๋ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ ์ฝ๋ ์ํ
object_df = pd.DataFrame(columns=field_names)
object_df = object_df.loc[:, field_names]
# df -> html
table_html = object_df.to_html(escape=False)
# create button
url = generate_url(base_url, os.path.join(url_path, 'create'))
button_tag = create_button(url, 'create')
crud_table = button_tag + table_html
return crud_table
ํ์ง๋ง ํ์ผ ๋ค์ด๋ก๋ ๋งํฌ๊ฐ ์๋ crud table ์ ์๋ table ์ ์ฌ์ฉํฉ๋๋ค.#<-- ์ถ๊ฐ๋ ์ฝ๋
์ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด callback function ์ ํตํด์ ์ฐ๋ฆฌ๋ ๋ค์ํ ์์ ๋ค์ ์ํ ํ ์ ์์ต๋๋ค. ํด๋น function ์์์ callback function ์ ๋ฑํ ์ ํด์ง ๋ชฉ์ ์ ์์ง๋ง ๋ํ์ ์ผ๋ก 2๊ฐ์ง ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์ํํฉ๋๋ค.
-
content design ์ ์ ํ๊ฑฐ๋ html ์ ์ถ๊ฐํ๋ ์์ ๋ค์ ์ํํฉ๋๋ค.
-
์ ๋ชฉ ์ ์ถ๊ฐํ๋ ์์ ๋ค์ ์ํํฉ๋๋ค.
title = h_tag(2, 'ํ๋ก์ ํธ ๋ชฉ๋ก')
-
์ ์์ ์์๋
curd_table_html
์div class=card
์ curd_table_html ์ ์ฝ์ ํ๋ ์์ ๋ค์ ์ํํฉ๋๋ค.added_contents = kwargs['added_contents'] added_contents[0] = title + card_row((added_contents[0], 12)
-
added_contents
์ ์ถ๊ฐ๋ ์๋ฃ๋ ์์๋๋ก ํ๋ฉด์ ๋๋๋ง ๋ฉ๋๋ค.
์ฌ์ฉ์๋ ํค์๋ ์ธ์๋ฅผ ํตํด ๋ณด๋ค ์์ ๋กญ๊ฒ ์์
๋ค์ ์ํ ํ ์ ์์ต๋๋ค.