mirror of
https://github.com/fastapi-admin/fastapi-admin.git
synced 2025-08-16 03:40:26 +08:00
update
This commit is contained in:
@ -1,10 +1,11 @@
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, Path
|
||||
from jinja2 import TemplateNotFound
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import RedirectResponse
|
||||
from starlette.status import HTTP_303_SEE_OTHER
|
||||
from tortoise import Model
|
||||
from tortoise.fields import ManyToManyRelation
|
||||
from tortoise.transactions import in_transaction
|
||||
|
||||
from fastapi_admin.depends import get_model, get_model_resource, get_resources
|
||||
from fastapi_admin.resources import Model as ModelResource
|
||||
@ -38,27 +39,34 @@ async def list_view(
|
||||
qs = qs.offset((page_num - 1) * page_size)
|
||||
values = await qs.values_list(*fields_name)
|
||||
values = await render_values(fields, values)
|
||||
return templates.TemplateResponse(
|
||||
"list.html",
|
||||
context={
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"fields_label": fields_label,
|
||||
"fields": fields,
|
||||
"values": values,
|
||||
"filters": filters,
|
||||
"resource": resource,
|
||||
"model_resource": model_resource,
|
||||
"resource_label": model_resource.label,
|
||||
"page_size": page_size,
|
||||
"page_num": page_num,
|
||||
"total": total,
|
||||
"from": page_size * (page_num - 1) + 1,
|
||||
"to": page_size * page_num,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
},
|
||||
)
|
||||
context = {
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"fields_label": fields_label,
|
||||
"fields": fields,
|
||||
"values": values,
|
||||
"filters": filters,
|
||||
"resource": resource,
|
||||
"model_resource": model_resource,
|
||||
"resource_label": model_resource.label,
|
||||
"page_size": page_size,
|
||||
"page_num": page_num,
|
||||
"total": total,
|
||||
"from": page_size * (page_num - 1) + 1,
|
||||
"to": page_size * page_num,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
}
|
||||
try:
|
||||
return templates.TemplateResponse(
|
||||
f"{resource}/list.html",
|
||||
context=context,
|
||||
)
|
||||
except TemplateNotFound:
|
||||
return templates.TemplateResponse(
|
||||
"list.html",
|
||||
context=context,
|
||||
)
|
||||
|
||||
|
||||
@router.post("/{resource}/update/{pk}")
|
||||
@ -71,25 +79,50 @@ async def update(
|
||||
model=Depends(get_model),
|
||||
):
|
||||
form = await request.form()
|
||||
data = await model_resource.resolve_data(dict(form))
|
||||
obj = await model.get(pk=pk)
|
||||
await obj.update_from_dict(data).save()
|
||||
data, m2m_data = await model_resource.resolve_data(form)
|
||||
async with in_transaction() as conn:
|
||||
obj = (
|
||||
await model.filter(pk=pk)
|
||||
.using_db(conn)
|
||||
.select_for_update()
|
||||
.get()
|
||||
.prefetch_related(*model_resource.get_m2m_field())
|
||||
)
|
||||
await obj.update_from_dict(data).save(using_db=conn)
|
||||
for k, items in m2m_data.items():
|
||||
m2m_obj = getattr(obj, k)
|
||||
await m2m_obj.clear()
|
||||
if items:
|
||||
await m2m_obj.add(*items)
|
||||
obj = (
|
||||
await model.filter(pk=pk)
|
||||
.using_db(conn)
|
||||
.get()
|
||||
.prefetch_related(*model_resource.get_m2m_field())
|
||||
)
|
||||
inputs = await model_resource.get_inputs(obj)
|
||||
if "save" in form.keys():
|
||||
return templates.TemplateResponse(
|
||||
"update.html",
|
||||
context={
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"model_resource": model_resource,
|
||||
"inputs": inputs,
|
||||
"pk": pk,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
},
|
||||
)
|
||||
context = {
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"model_resource": model_resource,
|
||||
"inputs": inputs,
|
||||
"pk": pk,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
}
|
||||
try:
|
||||
return templates.TemplateResponse(
|
||||
f"{resource}/update.html",
|
||||
context=context,
|
||||
)
|
||||
except TemplateNotFound:
|
||||
return templates.TemplateResponse(
|
||||
"update.html",
|
||||
context=context,
|
||||
)
|
||||
return redirect(request, "list_view", resource=resource)
|
||||
|
||||
|
||||
@ -104,20 +137,27 @@ async def update_view(
|
||||
):
|
||||
obj = await model.get(pk=pk)
|
||||
inputs = await model_resource.get_inputs(obj)
|
||||
return templates.TemplateResponse(
|
||||
"update.html",
|
||||
context={
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"inputs": inputs,
|
||||
"pk": pk,
|
||||
"model_resource": model_resource,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
},
|
||||
)
|
||||
context = {
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"inputs": inputs,
|
||||
"pk": pk,
|
||||
"model_resource": model_resource,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
}
|
||||
try:
|
||||
return templates.TemplateResponse(
|
||||
f"{resource}/update.html",
|
||||
context=context,
|
||||
)
|
||||
except TemplateNotFound:
|
||||
return templates.TemplateResponse(
|
||||
"update.html",
|
||||
context=context,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{resource}/create")
|
||||
@ -128,19 +168,26 @@ async def create_view(
|
||||
model_resource: ModelResource = Depends(get_model_resource),
|
||||
):
|
||||
inputs = await model_resource.get_inputs()
|
||||
return templates.TemplateResponse(
|
||||
"create.html",
|
||||
context={
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"inputs": inputs,
|
||||
"model_resource": model_resource,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
},
|
||||
)
|
||||
context = {
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"inputs": inputs,
|
||||
"model_resource": model_resource,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
}
|
||||
try:
|
||||
return templates.TemplateResponse(
|
||||
f"{resource}/create.html",
|
||||
context=context,
|
||||
)
|
||||
except TemplateNotFound:
|
||||
return templates.TemplateResponse(
|
||||
"create.html",
|
||||
context=context,
|
||||
)
|
||||
|
||||
|
||||
@router.post("/{resource}/create")
|
||||
@ -153,23 +200,34 @@ async def create(
|
||||
):
|
||||
inputs = await model_resource.get_inputs()
|
||||
form = await request.form()
|
||||
data = await model_resource.resolve_data(dict(form))
|
||||
await model.create(**data)
|
||||
data, m2m_data = await model_resource.resolve_data(form)
|
||||
async with in_transaction() as conn:
|
||||
obj = await model.create(**data, using_db=conn)
|
||||
for k, items in m2m_data.items():
|
||||
m2m_obj = getattr(obj, k) # type:ManyToManyRelation
|
||||
await m2m_obj.add(*items, using_db=conn)
|
||||
if "save" in form.keys():
|
||||
return redirect(request, "list_view", resource=resource)
|
||||
return templates.TemplateResponse(
|
||||
"create.html",
|
||||
context={
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"inputs": inputs,
|
||||
"model_resource": model_resource,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
},
|
||||
)
|
||||
context = {
|
||||
"request": request,
|
||||
"resources": resources,
|
||||
"resource_label": model_resource.label,
|
||||
"resource": resource,
|
||||
"inputs": inputs,
|
||||
"model_resource": model_resource,
|
||||
"page_title": model_resource.page_title,
|
||||
"page_pre_title": model_resource.page_pre_title,
|
||||
}
|
||||
try:
|
||||
return templates.TemplateResponse(
|
||||
f"{resource}/create.html",
|
||||
context=context,
|
||||
)
|
||||
except TemplateNotFound:
|
||||
return templates.TemplateResponse(
|
||||
"create.html",
|
||||
context=context,
|
||||
)
|
||||
|
||||
|
||||
@router.delete("/{resource}/delete/{pk}")
|
||||
|
Reference in New Issue
Block a user