async def update( request: Request, resource: str = Path(...), pk: int = Path(...), model_resource: ModelResource = Depends(get_model_resource), resources=Depends(get_resources), model=Depends(get_model), ): form = await request.form() data, m2m_data = await model_resource.resolve_data(request, 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(): 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)
async def create( request: Request, resource: str = Path(...), resources=Depends(get_resources), model_resource: ModelResource = Depends(get_model_resource), model=Depends(get_model), ): inputs = await model_resource.get_inputs(request) form = await request.form() data, m2m_data = await model_resource.resolve_data(request, 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) 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, )