{"info":{"_postman_id":"64edfa6b-bc62-4bfc-b82b-05e7e11b6aa2","name":"python.web.id - v1.2","description":"<html><head></head><body><p><strong>Welcome to Python.web.id API</strong></p>\n<p><strong>Preparation:</strong></p>\n<p>Python.web.id API can be requested trought HTTPS Request to the Python.web.id Base URL endpoint.</p>\n<ul>\n<li>Localhost Environment: <a href=\"http://127.0.0.1:8000\">http://127.0.0.1:8000</a></li>\n<li>Production Environment: <a href=\"https://python.web.id\">https://python.web.id</a></li>\n</ul>\n<p><strong>Standard API Response:</strong></p>\n<p>All API Responses are applied with standard response as follows:</p>\n<p><strong>1. success single</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n   \"status\": 200,                       // int : http status, can be 201, 200, etc.\n   \"success\": true,                     // bool: boolean to identify the response is success or failed.\n   \"message\": \"The success message\",    // str : string success message or null\n   \"result\": {}                         // dict: a dict response data\n}\n</code></pre><p><strong>2. success list</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n   \"status\": 200,      // int : http status\n   \"success\": true,    // bool: boolean to identify the response is success or failed.\n   \"message\": null,    // str : string message or null.\n   \"results\": [],      // arr : a list/array\n\n   \"count\": 2,                                                   // int: all total result items\n   \"page_size\": 5,                                               // int: maximum items per-page\n   \"current_page\": 1,                                            // int: your current page\n   \"next\": \"http://127.0.0.1:8000/api/page/?page=2&amp;search=a\",    // str: string link or null.\n   \"previous\": null                                              // str: string link or null.\n}\n</code></pre><p><strong>3. error/failed</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n   \"status\": 400,                      // int : http status, can be 403,404,500,etc..\n   \"success\": false,                   // bool: boolean to identify the response is success or failed.\n   \"message\": \"The failed message\",    // str : string failed message or null\n   \"result\": {}                        // dict: a dict response data\n}\n</code></pre></body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"5291388","collectionId":"64edfa6b-bc62-4bfc-b82b-05e7e11b6aa2","publishedId":"TVRkZnrS","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"publishDate":"2020-10-10T10:40:26.000Z"},"item":[{"name":"Auth Login","id":"4169a407-ace6-4900-a1a9-fce34db995d7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","type":"text","value":"application/json"},{"key":"Accept","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"username\": \"your-username\",\n  \"password\": \"your-password\"\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/auth/login/","description":"<ul>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n<li><code>Content-Type</code> is content type data, please fill <code>application/json</code>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>username</code> is string username/email of <strong>User</strong> <em>(required)</em>.</li>\n<li>param <code>password</code> is string password of <strong>User</strong> <em>(required)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","auth","login",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"18f19c5e-ec5e-49e5-81aa-325736d4194b","name":"Error - No Credentials","originalRequest":{"method":"POST","header":[{"key":"Content-Type","type":"text","value":"application/json"},{"key":"Accept","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"username\": \"your-username\",\n  \"password\": \"your-password\"\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/auth/login/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:11:25 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"POST, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"105"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 400,\n    \"result\": {},\n    \"message\": \"Unable to log in with provided credentials.\",\n    \"success\": false\n}"},{"id":"751d62f8-8b49-4928-ae51-febe92b26377","name":"Error - Fields","originalRequest":{"method":"POST","header":[{"key":"Content-Type","type":"text","value":"application/json"},{"key":"Accept","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/auth/login/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:40:50 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"POST, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"134"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 400,\n    \"result\": {},\n    \"message\": \"username: This field is required.<br />password: This field is required.\",\n    \"success\": false\n}"},{"id":"ae75b162-912f-4f69-9f4d-81f19a73639f","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"username\": \"your-username\",\n  \"password\": \"your-password\"\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/auth/login/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 03:26:34 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"POST, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"215"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"result\": {\n        \"token\": \"0f146eedf3696c242fac507dea139440de931e29\",\n        \"user_id\": 183,\n        \"email\": \"your-email@gmail.com\",\n        \"expiration_date\": \"2021-10-10T10:26:34.807\"\n    },\n    \"message\": \"Success\",\n    \"status\": 200\n}"}],"_postman_id":"4169a407-ace6-4900-a1a9-fce34db995d7"},{"name":"Auth Logout","id":"8538d8c2-34f5-4cbe-99a6-f5ad35e02d6d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":"{{url}}/api/v1/auth/logout/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n</ul>\n","urlObject":{"path":["api","v1","auth","logout",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"12301516-58c5-42d6-883d-8be15467eb60","name":"Error - Invalid Token","originalRequest":{"method":"POST","header":[{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Authorization","value":"Token xxxxxx","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":"{{url}}/api/v1/auth/logout/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:11:42 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, POST, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"},{"id":"960b8b50-c170-4f41-9581-14fcdc7058c0","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":"{{url}}/api/v1/auth/logout/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 04:02:15 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Cookie, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"81"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 200,\n    \"message\": \"Successfully logout.\",\n    \"result\": {},\n    \"success\": true\n}"}],"_postman_id":"8538d8c2-34f5-4cbe-99a6-f5ad35e02d6d"},{"name":"Auth User Detail","id":"be508ba0-3d94-4ef4-a7ae-1e922c740b57","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/auth/user/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n</ul>\n","urlObject":{"path":["api","v1","auth","user",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"7d209205-eb12-49f3-93c3-902b11952799","name":"Success","originalRequest":{"method":"GET","header":[{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/auth/user/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 22:22:58 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, PUT, PATCH, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"565"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"result\": {\n        \"user\": {\n            \"id\": 182,\n            \"username\": \"your-username\",\n            \"email\": \"your-email@gmail.com\",\n            \"groups\": [],\n            \"first_name\": \"\",\n            \"last_name\": \"\",\n            \"last_login\": \"2020-10-11T05:00:01.832415\"\n        },\n        \"token\": {\n            \"key\": \"e3367524b6d4879f0842782ebb56c2c693152141\",\n            \"expiration_date\": \"2021-10-11T05:22:58.616305\"\n        },\n        \"profile\": {\n            \"display_name\": \"Your Name\",\n            \"location\": \"Jakarta, Indonesia\",\n            \"birth_date\": null,\n            \"about_me\": null,\n            \"website\": \"https://python.web.id\",\n            \"github\": \"https://github.com/foobar\",\n            \"linkedin\": \"https://www.linkedin.com/in/foobar\",\n            \"instagram\": null,\n            \"twitter\": null\n        }\n    },\n    \"status\": 200,\n    \"success\": true,\n    \"message\": \"Success\"\n}"},{"id":"812f7cb7-af2d-49d8-b6c4-8b7d6ebe1136","name":"Error - Invalid Token","originalRequest":{"method":"GET","header":[{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Authorization","type":"text","value":"Token xxxxx"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/auth/user/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 22:23:51 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, PUT, PATCH, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"}],"_postman_id":"be508ba0-3d94-4ef4-a7ae-1e922c740b57"},{"name":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~","id":"df2736ca-cfb0-4a9d-957d-95bda0fd96af","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"HEAD","header":[],"url":"","urlObject":{"query":[],"variable":[]}},"response":[],"_postman_id":"df2736ca-cfb0-4a9d-957d-95bda0fd96af"},{"name":"Tag List","id":"042bb337-4c35-4df2-bc07-8cadd58ecf1a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/tag/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>page</code> is integer page to show specific page <em>(optional)</em>.</li>\n<li>param <code>limit</code> is integer limit of results to get the cutom results, don't use this limit and page together <em>(optional)</em>.</li>\n<li>param <code>name</code> is string slug name of <strong>Tag</strong> to filter specific <code>name</code> <em>(optional)</em>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>search</code> is string query to search the <strong>Tag</strong> by field <code>name</code> &amp; <code>description</code> <em>(optional)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","tag",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"087edd2a-0d34-46d4-97b8-18857f1fc6bc","name":"Success - Pagination","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?page=2","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:33:29 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"1211"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 43,\n    \"page_size\": 20,\n    \"current_page\": 2,\n    \"next\": \"http://127.0.0.1:8000/api/v1/tag/?page=3\",\n    \"previous\": \"http://127.0.0.1:8000/api/v1/tag/\",\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 23,\n            \"name\": \"ajax\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 22,\n            \"name\": \"multi-databases\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 21,\n            \"name\": \"sso\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 20,\n            \"name\": \"news\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 19,\n            \"name\": \"templates\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 18,\n            \"name\": \"problem\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 17,\n            \"name\": \"database\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 16,\n            \"name\": \"settings\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 15,\n            \"name\": \"module\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 14,\n            \"name\": \"grabber\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 13,\n            \"name\": \"network\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 12,\n            \"name\": \"app\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 11,\n            \"name\": \"django\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 10,\n            \"name\": \"tricks\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 9,\n            \"name\": \"project\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 8,\n            \"name\": \"internet\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 7,\n            \"name\": \"security\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 6,\n            \"name\": \"looping\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 5,\n            \"name\": \"directory\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 4,\n            \"name\": \"beginner\",\n            \"description\": \"\"\n        }\n    ]\n}"},{"id":"3da61df6-4d66-4b0c-88cd-e81e6a48b3a3","name":"Success","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/tag/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 09:27:56 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"1239"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 43,\n    \"page_size\": 20,\n    \"current_page\": 1,\n    \"next\": \"http://127.0.0.1:8000/api/v1/tag/?page=2\",\n    \"previous\": null,\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 43,\n            \"name\": \"dada-dada\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 42,\n            \"name\": \"coba\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 41,\n            \"name\": \"refferences\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 40,\n            \"name\": \"ubuntu\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 39,\n            \"name\": \"django-framework-beginner\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 38,\n            \"name\": \"django-rest-framework\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 37,\n            \"name\": \"ruby-on-rails\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 36,\n            \"name\": \"ruby\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 35,\n            \"name\": \"bash\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 34,\n            \"name\": \"markdown\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 33,\n            \"name\": \"django-orm\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 32,\n            \"name\": \"javascript\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 31,\n            \"name\": \"git\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 30,\n            \"name\": \"server\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 29,\n            \"name\": \"email\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 28,\n            \"name\": \"linux\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 27,\n            \"name\": \"solution\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 26,\n            \"name\": \"python\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 25,\n            \"name\": \"multi-languages\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 24,\n            \"name\": \"internationalization\",\n            \"description\": \"\"\n        }\n    ]\n}"},{"id":"7d42a7e2-22d0-4dfd-bf3b-ab6cc8ed8f16","name":"Success - Limitation","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?limit=50","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"limit","value":"50"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:32:49 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"2332"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 43,\n    \"page_size\": 50,\n    \"current_page\": 1,\n    \"next\": null,\n    \"previous\": null,\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 43,\n            \"name\": \"dada-dada\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 42,\n            \"name\": \"coba\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 41,\n            \"name\": \"refferences\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 40,\n            \"name\": \"ubuntu\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 39,\n            \"name\": \"django-framework-beginner\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 38,\n            \"name\": \"django-rest-framework\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 37,\n            \"name\": \"ruby-on-rails\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 36,\n            \"name\": \"ruby\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 35,\n            \"name\": \"bash\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 34,\n            \"name\": \"markdown\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 33,\n            \"name\": \"django-orm\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 32,\n            \"name\": \"javascript\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 31,\n            \"name\": \"git\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 30,\n            \"name\": \"server\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 29,\n            \"name\": \"email\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 28,\n            \"name\": \"linux\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 27,\n            \"name\": \"solution\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 26,\n            \"name\": \"python\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 25,\n            \"name\": \"multi-languages\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 24,\n            \"name\": \"internationalization\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 23,\n            \"name\": \"ajax\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 22,\n            \"name\": \"multi-databases\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 21,\n            \"name\": \"sso\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 20,\n            \"name\": \"news\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 19,\n            \"name\": \"templates\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 18,\n            \"name\": \"problem\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 17,\n            \"name\": \"database\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 16,\n            \"name\": \"settings\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 15,\n            \"name\": \"module\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 14,\n            \"name\": \"grabber\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 13,\n            \"name\": \"network\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 12,\n            \"name\": \"app\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 11,\n            \"name\": \"django\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 10,\n            \"name\": \"tricks\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 9,\n            \"name\": \"project\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 8,\n            \"name\": \"internet\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 7,\n            \"name\": \"security\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 6,\n            \"name\": \"looping\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 5,\n            \"name\": \"directory\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 4,\n            \"name\": \"beginner\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 3,\n            \"name\": \"api\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 2,\n            \"name\": \"drf\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 1,\n            \"name\": \"flask\",\n            \"description\": \"\"\n        }\n    ]\n}"},{"id":"b6df9c49-cdea-4cfd-8e29-190bc879384b","name":"Error - Invalid Token","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token xxxxx"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?page=2","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:34:13 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"},{"id":"f1776407-5d0c-4ddb-8645-d28e7c96a6bb","name":"Error - Invalid Page","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?page=99999","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"page","value":"99999"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:34:31 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"75"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 404,\n    \"result\": {},\n    \"message\": \"Invalid page.\",\n    \"success\": false\n}"}],"_postman_id":"042bb337-4c35-4df2-bc07-8cadd58ecf1a"},{"name":"Tag Detail","id":"bd5f9fd1-083a-4ddb-93b7-a0e9b14acba1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/tag/?id=1","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>id</code> is integer id of <strong>Tag</strong> <em>(required)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","tag",""],"host":["{{url}}"],"query":[{"key":"id","value":"1"}],"variable":[]}},"response":[{"id":"3a4d3a3b-0c3f-401d-8314-7f97fd897f02","name":"Error - Invalid Token","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token xxxxx"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?id=1","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"id","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:13:18 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"},{"id":"b0e05d51-cb14-4203-9146-8d050da8b034","name":"Error - Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?id=99999","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"id","value":"99999"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:13:33 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"72"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 404,\n    \"result\": {},\n    \"message\": \"Not found.\",\n    \"success\": false\n}"},{"id":"d6eef3cc-5706-49d8-8f2d-94204da9204a","name":"Success","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/tag/?id=1","host":["{{url}}"],"path":["api","v1","tag",""],"query":[{"key":"id","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 09:40:32 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"get"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"111"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 200,\n    \"result\": {\n        \"id\": 1,\n        \"name\": \"flask\",\n        \"description\": \"\"\n    },\n    \"message\": \"Success\",\n    \"success\": true\n}"}],"_postman_id":"bd5f9fd1-083a-4ddb-93b7-a0e9b14acba1"},{"name":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~","id":"bc9d50f5-89f9-49fe-875f-66e89b2ae75b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"HEAD","header":[],"url":"","urlObject":{"query":[],"variable":[]}},"response":[],"_postman_id":"bc9d50f5-89f9-49fe-875f-66e89b2ae75b"},{"name":"Post Create","id":"c0c4dcc2-e967-4795-b4c0-8246ff42b0ee","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Accept-Language","value":"en","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Hello World Guys\",\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n<li><code>Content-Type</code> is content type data, please fill <code>application/json</code>.</li>\n</ul>\n<hr />\n<p><strong>Primary Fileds:</strong></p>\n<ul>\n<li>body <code>title</code> is string title of <strong>Post</strong> <em>(required)</em>.</li>\n<li>body <code>description</code> is long string description of <strong>Post</strong> <em>(required)</em>.</li>\n<li>body <code>tags</code> is list integer id of <strong>Tags</strong> <em>(required)</em>.</li>\n</ul>\n<p><strong>Optional Fields:</strong></p>\n<ul>\n<li>body <code>keywords</code> is string list keywords, e.g: <code>\"django\", \"hello world\"</code> <em>(optional)</em>.</li>\n<li>body <code>meta_description</code> is long string of meta description <em>(optional)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","post",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"0c116278-6c38-4ecb-9558-ad716f62d820","name":"Error - Invalid Token","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Token xxxxx","type":"text"},{"key":"Accept-Language","value":"en","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Hello World Guys\",\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:42:17 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"},{"id":"3b8fe512-c29b-4b43-8a89-2dae9227b455","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Accept-Language","value":"en","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Hello World Guys\",\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 10:57:15 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"602"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 200,\n    \"result\": {\n        \"id\": 103,\n        \"absolute_url\": \"/posts/detail/hello-world-guys/\",\n        \"created_at\": \"2020-10-10T17:57:15.542170\",\n        \"updated_at\": \"2020-10-10T17:57:15.542198\",\n        \"title\": \"Hello World Guys\",\n        \"slug\": \"hello-world-guys\",\n        \"description\": \"This is a description of hello world\",\n        \"keywords\": null,\n        \"meta_description\": null,\n        \"is_featured\": false,\n        \"rating_likes\": 0,\n        \"rating_dislikes\": 0,\n        \"author\": \"agaust\",\n        \"tags\": [\n            {\n                \"id\": 3,\n                \"name\": \"api\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 2,\n                \"name\": \"drf\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 1,\n                \"name\": \"flask\",\n                \"description\": \"\"\n            }\n        ]\n    },\n    \"message\": \"Success\",\n    \"success\": true\n}"},{"id":"ce6d91ea-276c-405a-b40e-a163878a941a","name":"Error - Fields","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Accept-Language","value":"en","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Hello World Guys\"\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:42:00 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"133"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 400,\n    \"result\": {},\n    \"message\": \"description: This field is required.<br />tags: This field is required.\",\n    \"success\": false\n}"}],"_postman_id":"c0c4dcc2-e967-4795-b4c0-8246ff42b0ee"},{"name":"Post Update","id":"3cc42633-e96e-4a11-97b5-a73aed0422f2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 103,\n  \"title\": \"Hello World Guys\",\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n<li><code>Content-Type</code> is content type data, please fill <code>application/json</code>.</li>\n</ul>\n<hr />\n<p><strong>Primary Fileds:</strong></p>\n<ul>\n<li>body <code>title</code> is string title of <strong>Post</strong> <em>(required)</em>.</li>\n<li>body <code>description</code> is long string description of <strong>Post</strong> <em>(required)</em>.</li>\n<li>body <code>tags</code> is list integer id of <strong>Tags</strong> <em>(required)</em>.</li>\n</ul>\n<p><strong>Optional Fields:</strong></p>\n<ul>\n<li>body <code>keywords</code> is string list keywords, e.g: <code>\"django\", \"hello world\"</code> <em>(optional)</em>.</li>\n<li>body <code>meta_description</code> is long string of meta description <em>(optional)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","post",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"d3fedc80-392c-4c6d-900a-add17a5387af","name":"Success","originalRequest":{"method":"PUT","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1,\n  \"title\": \"Hello World Guys\",\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 11:58:50 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"602"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 200,\n    \"result\": {\n        \"id\": 1,\n        \"absolute_url\": \"/posts/detail/hello-world-guys/\",\n        \"created_at\": \"2020-10-10T17:57:15.542170\",\n        \"updated_at\": \"2020-10-10T18:58:50.426260\",\n        \"title\": \"Hello World Guys\",\n        \"slug\": \"hello-world-guys\",\n        \"description\": \"This is a description of hello world\",\n        \"keywords\": null,\n        \"meta_description\": null,\n        \"is_featured\": false,\n        \"rating_likes\": 0,\n        \"rating_dislikes\": 0,\n        \"author\": \"agaust\",\n        \"tags\": [\n            {\n                \"id\": 3,\n                \"name\": \"api\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 2,\n                \"name\": \"drf\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 1,\n                \"name\": \"flask\",\n                \"description\": \"\"\n            }\n        ]\n    },\n    \"message\": \"Success\",\n    \"success\": true\n}"},{"id":"e4a0614a-db09-43cc-a8fa-bdd844c28155","name":"Error - Fields","originalRequest":{"method":"PUT","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:42:48 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"95"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 400,\n    \"message\": \"KeyError argument id is required!\",\n    \"result\": {},\n    \"success\": false\n}"},{"id":"ec8117e2-c441-49a3-9a6e-cae1374308d9","name":"Error - Invalid Token","originalRequest":{"method":"PUT","header":[{"key":"Authorization","type":"text","value":"Token xxxxx"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 103,\n  \"title\": \"Hello World Guys\",\n  \"description\": \"This is a description of hello world\",\n  \"tags\": [\n      1, 2, 3\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:43:35 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"}],"_postman_id":"3cc42633-e96e-4a11-97b5-a73aed0422f2"},{"name":"Post List","id":"79863d68-4560-4aea-9ea5-c533ef8bccde","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":"{{url}}/api/v1/post/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>page</code> is integer page to show specific page <em>(optional)</em>.</li>\n<li>param <code>limit</code> is integer limit of results to get the cutom results, don't use this limit and page together <em>(optional)</em>.</li>\n<li>param <code>author__username</code> is string username of <strong>Author</strong>, to filter posts by specific author <em>(optional)</em>.</li>\n<li>param <code>tags__name</code> is string slug name of <strong>Tag</strong>, to filter posts by specific tag <em>(optional)</em>.</li>\n<li>param <code>is_featured</code> is boolean to filter posts by featured posts <em>(default=false)</em>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>search</code> is string query to search the <strong>Post</strong> by field <code>title</code>, <code>description</code>, <code>meta_description</code>, &amp; <code>keywords</code> <em>(optional)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","post",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"091b0c65-7c4f-4a20-840f-25a5e3c9e151","name":"Success - Pagination","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":{"raw":"{{url}}/api/v1/post/?page=2","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:36:35 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"72921"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 103,\n    \"page_size\": 20,\n    \"current_page\": 2,\n    \"next\": \"http://127.0.0.1:8000/api/v1/post/?page=3\",\n    \"previous\": \"http://127.0.0.1:8000/api/v1/post/\",\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 83,\n            \"absolute_url\": \"/posts/detail/simple-adding-django-disqus-comments/\",\n            \"created_at\": \"2020-10-10T10:42:40.598005\",\n            \"updated_at\": \"2020-10-10T10:42:40.605916\",\n            \"title\": \"Simple Adding Django Disqus Comments\",\n            \"slug\": \"simple-adding-django-disqus-comments\",\n            \"description\": \"Simple Adding Django Disqus Comments, Disqus adalah salah satu comments plugin yang sangat populer saat ini. Selain facebook comments, google+ comments, disqus ini juga merupakan salah satu plugin favorite yang banyak digunakan para pengembang website. Selain tampilannya yang menarik, juga instalasinya yang simple dan tidak begitu rumit.\\r\\n\\r\\nDisqus Comments juga mensupport di Django, karena menurut saya pribadi Disqus Comments recomended ketika anda saat ini menggunakan Django, disamping face'nya yang lumayan baik, juga mudah dari segi instalasi.\\r\\n\\r\\nDjango disqus juga memberikan dokumentasi bagaimana cara instalasi, setting dan penggunaanya disini:[http://django-disqus.readthedocs.org/en/latest/installation.html](http://django-disqus.readthedocs.org/en/latest/installation.html \\\"Django Disqus\\\")\\r\\n\\r\\nDan pada bahasan kali ini, kita ambil contoh yang paling simple'nya.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nDalam instalasi ada beberapa cara, contohnya seperti menggunakan `pip`, `easy_install`, dan dengan cara menjalankan `setup.py` yang telah di extract.\\r\\n\\r\\n```\\r\\n$ pip install django-disqus\\r\\n```\\r\\n\\r\\n\\r\\nDan untuk setting apps dan api di `settings.py`, kurang lebih seperti ini:\\r\\n\\r\\n```\\r\\nINSTALLED_APPS = (\\r\\n     ...\\r\\n     'disqus',\\r\\n)\\r\\n\\r\\nDISQUS_API_KEY = 'FOOBARFOOBARFOOBARFOOBARFOOBARF'\\r\\nDISQUS_WEBSITE_SHORTNAME = 'foobar'\\r\\n```\\r\\n\\r\\n\\r\\nUntuk mendapatkan API disqus'nya bisa disini: [https://disqus.com/api/applications/](https://disqus.com/api/applications/ \\\"API Disqus\\\")\\r\\n\\r\\nDan untuk penempatan di template'nya seperti ini kurang lebihnya:\\r\\n\\r\\n```\\r\\n{% load disqus_tags %}\\r\\n{% set_disqus_identifier \\\"blogentry_\\\" object.title %}\\r\\n{% set_disqus_title page.title %}\\r\\n{% disqus_show_comments %}\\r\\n{% disqus_dev %}\\r\\n```\\r\\n\\r\\n\\r\\nSemoga bermanfaat.\\r\\n\\r\\nSource:\\r\\n- http://django-disqus.readthedocs.org/en/latest/installation.html\\r\\n- http://www.the-swamp.info/blog/adding-disqus-comments/\",\n            \"keywords\": \"django disqus, disqus, django, django disqus comments, disqus comments, tutorial django disqus comments\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 82,\n            \"absolute_url\": \"/posts/detail/menggunakan-graph-api-facebook-sangat-mudah-dengan-facepy/\",\n            \"created_at\": \"2020-10-10T10:42:40.585865\",\n            \"updated_at\": \"2020-10-10T10:42:40.591859\",\n            \"title\": \"Menggunakan Graph API Facebook sangat mudah dengan Facepy\",\n            \"slug\": \"menggunakan-graph-api-facebook-sangat-mudah-dengan-facepy\",\n            \"description\": \"Menggunakan Graph API Facebook sangat mudah dengan Facepy, Facepy adalah salah satu module tambahan untuk Python Programming yang dikembangkan guna memanfaatkan Graph API Facebook.\\r\\n\\r\\nTerimakasih banyak kepada `Bos Dadang`, yang memberikan referensi ini. Beberapa test yang kami lakukan contohnya seperti post ke group, dan membuat status.\\r\\n\\r\\nJika beberapa waktu lalu saya juga pernah menggunkan salah satu module tambahan untuk python, yaitu`fbcmd`, namun sayangnya beberapa tahun lalu developer `fbcmd` menyatakan R.I.P dengan repository yang dibuatnya, karena hak akses dari facebook yang diperketat.\\r\\n\\r\\nJika ingin melihat script fbcmd yang kita kembangkan, bisa lihat di github:[https://github.com/agusmakmun/Status-Facebook-Menggunakan-Python](https://github.com/agusmakmun/Status-Facebook-Menggunakan-Python \\\"Python FBCMD\\\")\\r\\n\\r\\n![Menggunakan Graph API Facebook sangat mudah dengan Facepy](https://python.web.id/media/gallery/Group_Tester.png \\\"Menggunakan Graph API Facebook sangat mudah dengan Facepy\\\")\\r\\n\\r\\nGambar diatas adalah salah satu contoh result yang dihasilkan dari module `Facepy` ini.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nUntuk instalasinya sangat mudah, pastikan anda memiliki `pip`, jika dengan manual bisa di download --> extract dan menjalankan `setup.py`'nya.\\r\\n\\r\\n\\r\\n```\\r\\n$ pip install facepy\\r\\n```\\r\\n\\r\\n\\r\\n### Penggunaan\\r\\n\\r\\nPastikan anda telah membuat app facebooknya, jika belum bisa menggunakan Graph API Explorer. dan berikut ini beberapa setting yang perlu diperhatikan.\\r\\n\\r\\n- https://www.facebook.com/settings?tab=applications&section=all   --> change to public access.\\r\\n- http://facepy.readthedocs.org/en/latest/usage/graph-api.html     --> docs graph api.\\r\\n- https://developers.facebook.com/tools/explorer/                  --> change to allow some premission.\\r\\n- https://github.com/jgorset/facepy                                --> repository.\\r\\n\\r\\nDan dibawah ini adalah penggunaan simple dari `Facepy` ini.\\r\\n\\r\\n```\\r\\nfrom facepy import GraphAPI\\r\\nACCESS_TOKEN = 'tokentokentokentoken'\\r\\nID_GROUP_OR_PAGE = '1234567890'\\r\\ngraph = GraphAPI(ACCESS_TOKEN)\\r\\n\\r\\ngraph.post(ID_GROUP_OR_PAGE+'/feed', message='Test My Status on Group/Pages')\\r\\ngraph.post('me/feed', message='Test My Status')\\r\\n```\\r\\n\\r\\n\\r\\nDjango juga di sediakan loo.. :D Untuk lebih lengkapnya bisa langsung dikunjungi repository-nya di github:[https://github.com/jgorset/facepy](https://github.com/jgorset/facepy \\\"Facepy\\\")\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"facebook, api facebook, facepy, graph api facebook, python facebook, django facebook\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 81,\n            \"absolute_url\": \"/posts/detail/sms-via-python/\",\n            \"created_at\": \"2020-10-10T10:42:40.575722\",\n            \"updated_at\": \"2020-10-10T10:42:40.581592\",\n            \"title\": \"SMS via Python\",\n            \"slug\": \"sms-via-python\",\n            \"description\": \"SMS via Python – Sms via python kali ini kita hanya memanfaatkan salah satu website yang menyediakan layanan sms gratis ini. Jika ingin membuat [SMS Gateway, bisa disini](http://bloggersmart.net/membuat-mesin-sms-gateway-dengan-raspberry-pi-kalkun-sms-gammu/ \\\"sms gateway\\\").\\r\\n\\r\\n![SMS via Python](https://python.web.id/media/gallery/sms-success-2.jpg \\\"SMS via Python\\\")\\r\\n\\r\\n```\\r\\n\\\"\\\"\\\"\\r\\nName             : Python SMS Sender\\r\\nCreated By       : Agus Makmun (Summon Agus)\\r\\nBlog             : bloggersmart.net - python.web.id\\r\\nLicense          : GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007\\r\\nDocumentation    : https://github.com/agusmakmun/Some-Examples-of-Simple-Python-Script/\\r\\n\\\"\\\"\\\"\\r\\n\\r\\nimport cookielib\\r\\nimport urllib2\\r\\nimport sys\\r\\n\\r\\nsms = raw_input('[+] Enter your SMS Message: ')\\r\\nno = raw_input('[+] Enter your number: ')\\r\\n\\r\\nprint '[+] In the process sending SMS....'\\r\\n\\r\\nurl ='http://www.smsgratis.web.id'\\r\\nbuka =  urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))\\r\\ndata= 'Phonenumbers='+no+'&Text='+sms+'&TOMBOL=KIRIM'\\r\\n\\r\\naction = 'http://www.smsgratis.web.id/index.php?d=wg3&f=sms'\\r\\n\\r\\ntry:\\r\\n    send = buka.open(action,data)\\r\\n    req = send.read()\\r\\n    send.close()\\r\\n\\r\\n    print '[+] Congratulation...'\\r\\n    print '[+] SMS wass successfull send to number : %s' % no\\r\\n    print '[+] Your Message is: %s' % sms\\r\\n\\r\\nexcept IOError:\\r\\n    print '[-] Upps..! Failed send SMS.'\\r\\n    sys.exit()\\r\\n```\",\n            \"keywords\": \"SMS via Python, python sms, python sms sender, sms, sms via python, sms via internet\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 80,\n            \"absolute_url\": \"/posts/detail/simple-project-python-downloader/\",\n            \"created_at\": \"2020-10-10T10:42:40.564245\",\n            \"updated_at\": \"2020-10-10T10:42:40.571383\",\n            \"title\": \"Simple Project Python Downloader\",\n            \"slug\": \"simple-project-python-downloader\",\n            \"description\": \"Simple Project Python Downloader– Simple Project ini adalah merupakan inovasi lanjutan dari [Script Simple Download dengan Python](../script-simple-download-dengan-python/index.html/index.html \\\"Script Simple Download dengan Python\\\"). Jika dalam Script Simple Download dengan Python menggunakan module `urllib`untuk mengakses ke internet, pada Simple Project Python Downloader kali ini memanfaatkan module `wget`\\r\\n\\r\\nUntuk lebih lengkapnya bisa dilihat disini [https://pypi.python.org/pypi/wget](https://pypi.python.org/pypi/wget \\\"https://pypi.python.org/pypi/wget\\\")\\r\\n\\r\\n### **Instalasi Module pada Linux (Ubuntu)**\\r\\n\\r\\nAda 2 metode yang dapat kita lakukan jika ingin menginstall module ini bagi yang belum punya.  \\r\\n**1.** Langsung dari Terminal.\\r\\n\\r\\n```\\r\\n$ sudo pip install wget\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Download > Ekstrak > Install  \\r\\nJika sudah didownload, bisa ekstrak secara manual atau dari terminal (*optional).  \\r\\nUntuk instalasinya:  \\r\\n– Masuk folder tujuan dengan terminal.  \\r\\n– Misalkan seperti ini.\\r\\n\\r\\n```\\r\\n$ cd Downloads\\r\\n$ cd wget-2.2\\r\\n$ python setup.py install\\r\\n```\\r\\n\\r\\nJika jika melihat cara dasar yang digunakan dalam module `wget` ini, kurang lebih penggunaannya seperti ini.\\r\\n\\r\\n```\\r\\n>>> import wget\\r\\n>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'\\r\\n>>> filename = wget.download(url)\\r\\n100% [................................................] 3841532 / 3841532>\\r\\n>> filename\\r\\n'razorback.mp3'\\r\\n```\\r\\n\\r\\n\\r\\nYang perlu di ingat, status (*bit download) tidak muncul ketika kita jalankan pada idle, dan biasanya langsung terlihat ketike sudah selesai. Jika ingin melihat status download, kami sarankan untuk menggunakan Terminal langsung (dalam eksekusinya).\\r\\n\\r\\nNah script diatas adalah merupakan script dasar yang digunakan. Lebih dari itu, kita juga bisa memodifikasi dari download file yang kita inginkan. Seperti halnya pada Simple Project Python Downloader ini.\\r\\n\\r\\n#### **Methode Kerja**\\r\\n\\r\\nMengenai cara kerja dari Simple Project Python Downloader ini intinya adalah user (kita) disuruh memasukkan berapa jumlah url download yang akan di masukkan, kemudian user (kita) disuruh memasukkan inputan lagi yaitu berupa url downloadnya. Dan Program akan berkerja setelah semua inputan url download sesuai dengan awal jumlah inputan yang di inginkan.\\r\\n\\r\\nDan metode downloadnya berurutan, yaitu url yang pertama akan diproses terlebih dahulu, kemudian menyusul pada url ke-2 dan selanjutnya.\\r\\n\\r\\nJika 1 url sudah terdownload 100%, maka program akan menampilkan pesan bahwa url tersebut sudah selesai downloadnya.\\r\\n\\r\\n```\\r\\n'''\\r\\nCredit By : http://python.web.id\\r\\nAuthor    : Agus Makmun (Summon Agus)\\r\\nName      : Python Downloader.\\r\\nPowered   : Python (module wget), Ubuntu 14.04.\\r\\nTanks to  : Rama Patria Himawan for enumerate.\\r\\n'''\\r\\n\\r\\nimport wget\\r\\n\\r\\ninp = input(\\\" [+] How Much files want to Download (ex:5)? \\\")\\r\\nprint \\\" [+] Download file is: %s files\\\" % inp\\r\\n\\r\\na = 0\\r\\ntmp = []\\r\\nwhile True:\\r\\n    if inp <= inp and inp != 0:\\r\\n        a += 1\\r\\n        inp_url = raw_input(\\\" [+] Paste url ke %s: \\\" %a)\\r\\n        tmp.append(inp_url)\\r\\n\\r\\n        if a == inp:\\r\\n            break  \\r\\n    else:\\r\\n        print False\\r\\n\\r\\nprint \\\" [+] Starting Download file...\\\"\\r\\nfor i, e in enumerate(tmp):\\r\\n    print wget.download(e)\\r\\n    print \\\" [+] Successfull...\\\"\\r\\n```\\r\\n\\r\\n#### **Penjelasan Singkat Program**\\r\\n\\r\\n**1.** Module yang kita butuhkan yaitu dengan menggunakan module `wget`, sehingga kita perlu meng-import nya terlebih dahulu.  \\r\\n**2.** Pada index `inp = `merupakan inputan yang berupa `integer` (*yaitu berapa banyak file yang akan kita download nantinya).  \\r\\n**3.** Disitu saya perlu menambahkan index baru berupa `a = 0` (*contohnya), disitu gunanya nantinya untuk memberitahu kepada user mengenai url ke berapa.  \\r\\n**4.** Pada index `tmp = []` disitu saya membuat temporary (*penyimpanan sementara), yang isinya adalah kosong. dimana pada `temporary` ini nantinya dihasilkan melalui inputan url dari user yang dimasukkan dan disimpan sementara kedalam `tmp = []` ini. intinya adalah setiap url yang di inputkan, akan di append (*ditambahkan kedalam `tmp = []` ini).  \\r\\nDan ketika kita lihat pada bagian `tmp` pada akhir setelah melakukan inputan beberapa url download, maka`tmp = []` ini akan menghasilkan list yang didalamnya berupa url inputan tersebut.  \\r\\nContohnya seperti ini:\\r\\n\\r\\n```\\r\\n>>> tmp\\r\\n['url_ke1', 'url_ke2', 'url_ke3', 'url_seterusnya']\\r\\n>>> \\r\\n```\\r\\n\\r\\n**5.** Disini kita menggunakan `while`, dan pada kondisi pertama yaitu jika inputan user kurang dari inputan user atau sama dengan inputan user dan tidak berupa `0`.  \\r\\n**6.** Dari penjelasan pada nomor ke-4, disitu kita mendapati data yang berupa list. dan untuk mengambilnya satu-satu secara berurutan didalam list tersebut, kita disini membutuhkan `enumerasi`.  \\r\\nContoh pada kasus ini:\\r\\n\\r\\n```\\r\\n>>> tmp = ['url_ke1', 'url_ke2', 'url_ke3', 'url_seterusnya']\\r\\n>>> for i, e in enumerate(tmp):\\r\\n    print i,e\\r\\n\\r\\n0 url_ke1\\r\\n1 url_ke2\\r\\n2 url_ke3\\r\\n3 url_seterusnya\\r\\n>>> \\r\\n```\\r\\n\\r\\nUntuk mengambil list tersebut secara berurutan, kita membutuhkan looping berupa `for` (*atau juga bisa menggunakan `while`).  \\r\\nJika kita menganalisis seperti ini:\\r\\n\\r\\n```\\r\\n>>> tmp[0]\\r\\n'url_ke1'\\r\\n```\\r\\n\\r\\n\\r\\nDalam cara tersebut, kita bisa memprosesnya jika digabungkan dengan module `wget`, namun kendalanya adalah kita harus satu-satu memproses isi dari list tersebut, oleh karena itu kita membutuhkan looping `for`, dengan `enumerate`.\",\n            \"keywords\": \"imple Project Python Downloader, Python Downloader, wget download, download via terminal, program download python, python downloader\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 79,\n            \"absolute_url\": \"/posts/detail/set-idle-python-as-default-open-in-linux-ubuntu/\",\n            \"created_at\": \"2020-10-10T10:42:40.547714\",\n            \"updated_at\": \"2020-10-10T10:42:40.554800\",\n            \"title\": \"Set Idle python as default open in linux ubuntu\",\n            \"slug\": \"set-idle-python-as-default-open-in-linux-ubuntu\",\n            \"description\": \"Set Idle python as default open in linux ubuntu, this day, i wanna show you simple tutorial how to Set Idle python as default open in linux ubuntu. This tutorial has been asked and solved by user and in[http://askubuntu.com/a/78645](http://askubuntu.com/a/78645 \\\"set idle python\\\").\\r\\n\\r\\nSo, there i want to re-share again in this tutorial with simple setting:\\r\\n\\r\\n**1.**Edit this location of applications with gedit or other editor.\\r\\n\\r\\n\\r\\n```\\r\\n$ gedit ~/.local/share/applications/mimeapps.list\\r\\n```\\r\\n\\r\\n\\r\\n**2.**Add this following text to bottom of `[ Applications ]` in `mimeapps.list`.\\r\\n\\r\\n\\r\\n```\\r\\ntext/x-python=idle.desktop;\\r\\n```\\r\\n\\r\\n\\r\\n**3.**Edit `idle.desktop` like this commands. requirements for installed `gksu`, if not installed please installed with this following commands: `$ sudo apt-get install gksu`. and then:\\r\\n\\r\\n```\\r\\n$ gksudo gedit /usr/share/applications/idle.desktop\\r\\n```\\r\\n\\r\\n\\r\\nIf that `idle.desktop` is blank, you can edit this `idle-python2.7.desktop`.\\r\\n\\r\\n**4.**Edit in this line `Exec=/usr/bin/idle`, change to `Exec=/usr/bin/idle -n %f`, and then complete script like this:\\r\\n\\r\\n```\\r\\n[Desktop Entry]\\r\\nName=IDLE\\r\\nComment=Integrated Development Environment for Python\\r\\nExec=/usr/bin/idle -n %f\\r\\nIcon=/usr/share/pixmaps/idle.xpm\\r\\nTerminal=false\\r\\nType=Application\\r\\nCategories=Application;Development;\\r\\nStartupNotify=true\\r\\n```\\r\\n\\r\\n\\r\\n**5.**Click Right on your script of python. and then change as default idle. \\r\\n\\r\\n![Set Idle python as default open in linux ubuntu](https://python.web.id/media/gallery/CWLwq.png \\\"Set Idle python as default open in linux ubuntu\\\")\",\n            \"keywords\": \"Set Idle python as default open in linux ubuntu, Set Idle python as default open, idle, python, idle python\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 78,\n            \"absolute_url\": \"/posts/detail/project-python-google-translate/\",\n            \"created_at\": \"2020-10-10T10:42:40.531359\",\n            \"updated_at\": \"2020-10-10T10:42:40.538852\",\n            \"title\": \"Project Python Google Translate\",\n            \"slug\": \"project-python-google-translate\",\n            \"description\": \"Project Python Google Translate – Program ini merupakan program Translate Bahasa yang memanfaatkan Layanan Google Translate yang diambil fungsi translatenya kemudian di terapkan pada Python Programming.\\r\\n\\r\\n**Program ini ada 2 file berupa:**  \\r\\n\\r\\n**1.** Translate.py ( merupakan programnya )  \\r\\n**2.** id_country.txt ( merupakan database ID Negara dan Nama Negara )\\r\\n\\r\\n```\\r\\n/*******************************\\r\\nCredit By : http://python.web.id\\r\\nAuthor    : Agus Makmun (Summon Agus)\\r\\nName      : Python Google Translate.\\r\\nPowered   : Python\\r\\nLicence   : GNU GENERAL PUBLIC LICENSE Version 2, June 1991.\\r\\nTanks to  : Kamyar Ghasemlou ( for adding tab file ).\\r\\n********************************/\\r\\n```\\r\\n\\r\\n\\r\\nUntuk File lengkapnya bisa langsung bisa dilihat di github:  \\r\\n**[https://github.com/agusmakmun/Python-Google-Translate/](https://github.com/agusmakmun/Python-Google-Translate/ \\\"Python Google Translate\\\")**\\r\\n\\r\\nCara Kerja:\\r\\n-----------\\r\\n\\r\\nUntuk cara kerjanya sendiri, jadi kita mengambil hasil result dari Google Translate ketika kita inputkan data tertentu untuk kemudian di translate ke bahasa yang kita inginkan.  \\r\\nDan module yang kita gunakan adalah module `urllib2` untuk mengakses ke Internet.\\r\\n\\r\\n### Pengambilan ID Country dan Name Country\\r\\n\\r\\nDisini kami sedikit mengakali bagaimana caranya agar mendapatkan ID dan Nama Negara saja dengan menggunakan Python, karena untuk keperluar tampilan ID dan Nama Negaranya di Program yang kita buat.\\r\\n\\r\\n\\r\\n```\\r\\nimport urllib2\\r\\nurl = 'https://translate.google.com/m?mui=tl'\\r\\nagent = {'User-Agent':'Mozilla/5.0'}\\r\\ncari_hasil = 'div class=\\\"small\\\">'\\r\\nend_tag = 'div class=\\\"small center\\\">'\\r\\nrequest = urllib2.Request(url, headers=agent)\\r\\npage = urllib2.urlopen(request).read()\\r\\nresult = page[page.find(cari_hasil)+len(cari_hasil):]\\r\\nres = result.replace('<br>', '').replace('Send us feedback', '').replace('in:<b>Mobile</b>', '')\\r\\n\\r\\noperasi = res.split()\\r\\n\\r\\ncount = 0\\r\\nwhile True:\\r\\n    try:\\r\\n        count += 1\\r\\n        spl = operasi[count].split()\\r\\n        y = spl\\r\\n        for s in y:\\r\\n            repp = s.replace('</a><a', '').replace('href=\\\"http://translate.google.com/m?tl=', '').replace('\\\">', '')            \\r\\n            kode = repp[:2]\\r\\n            negara = repp[2:].replace('</a></div><div', '')\\r\\n\\r\\n            if negara >= 'ass=\\\"small':\\r\\n                break\\r\\n            print kode, negara\\r\\n\\r\\n    except IndexError:\\r\\n        break\\r\\n```\\r\\n\\r\\n\\r\\nDari script diatas, data yang kita dapatkan hasilnya adalah seperti ini..\\r\\n\\r\\n```\\r\\naf Afrikaans\\r\\nsq Albanian\\r\\nar Arabic\\r\\nhy Armenian\\r\\naz Azerbaijani\\r\\neu Basque\\r\\nbe Belarusian\\r\\nbn Bengali\\r\\nbs Bosnian\\r\\nbg Bulgarian\\r\\nca Catalan\\r\\nny Chichewa\\r\\nzh -CNChinese\\r\\nzh -TWChinese\\r\\nhr Croatian\\r\\ncs Czech\\r\\nda Danish\\r\\n.....etc\\r\\n```\\r\\n\\r\\n\\r\\n**Masalah yang dihadapi:**  \\r\\nDari situ kita sudah mendapatkan data dengan `ID` dan `Name Country`, namun yang menjadi masalah adalah pada bagian data `zh -CNChinese` dan `zh -TWChinese` yang seharusnya `ID`-nya adalah `zh-CN` dan `zh-TW`(tanpa spasi).\\r\\n\\r\\nItu sebabnya mengapa kita membuat Database baru yang bernama `id_country.txt`, sebenarnya tanpa ini kita juga sudah bisa memanfaatkan Python Google Translate ini. Namun untuk mempermudah user dengan adanya tampilan data dari `ID` dan `Name Country`, sehingga tidak bingung ketika ingin memasukkan `ID`pada bahasa yang mereka tidak kenal.\\r\\n\\r\\nDidalam `id_country.txt` sendiri jika memang datanya seperti pada `zh -CNChinese` dan `zh -TWChinese`dengan menggunakan spasi, seperti yang ada pada data diatas, kami juga telah mengutiknya dengan membuatkan program seperti ini:\\r\\n\\r\\n```\\r\\nimport UserString\\r\\n\\r\\nf = open('id_country.txt', 'r')\\r\\ncount_me = 0\\r\\nlines = f.readlines()\\r\\nfor i in lines:\\r\\n    count_me += 1\\r\\n    if i[3] == '-':\\r\\n        depan = i[:2] + i[3:6]\\r\\n        belakang = UserString.MutableString(i).replace('\\\\n', '')\\r\\n        del belakang[:6]\\r\\n        print depan,'\\\\t', belakang            \\r\\n\\r\\n    else:\\r\\n        print i[:2], '\\\\t', i[3:].replace('\\\\n', '')\\r\\n```\\r\\n\\r\\nDan akan menghasilkan seperti ini (dengan tab):\\r\\n\\r\\n```\\r\\naf     Afrikaans\\r\\nsq  Albanian\\r\\nar  Arabic\\r\\nhy  Armenian\\r\\naz  Azerbaijani\\r\\neu  Basque\\r\\nbe  Belarusian\\r\\nbn  Bengali\\r\\nbs  Bosnian\\r\\nbg  Bulgarian\\r\\nca  Catalan\\r\\nny  Chichewa\\r\\nzh-CN   Chinese\\r\\nzh-TW   Chinese\\r\\nhr  Croatian\\r\\ncs  Czech\\r\\nda  Danish\\r\\n.....etc\\r\\n```\\r\\n\\r\\nDengan adanya tampilan yang demikian, maka muncul kendala lagi, yaitu akan memboroskan tampilan layar, oleh sebab itu alhamdulillah dengan bantuan dari forum stackoverflow oleh jawaban _Kamyar Ghasemlou_terjawab dengan menambahkan tab baru dengan panjang dari data yang dibagi 2, dan tampilan yang setelahnya menambah tab baru (hal ini akan lebih meminimalisir tampilan dari layar).\\r\\n\\r\\nKemudian kita kembangkan lagi menjadi 3 tab dengan script berikut ini:\\r\\n\\r\\n```\\r\\nf = open('id_country.txt','r')\\r\\nlines = f.readlines()\\r\\npanjang = len(lines)\\r\\n\\r\\nfor i in range(panjang/3):\\r\\n    print lines[i].replace('\\\\n', ''),'\\\\t', lines[i + panjang/2].replace('\\\\n', ''),'\\\\t', lines[i + panjang/3].replace('\\\\n', '')\\r\\nif panjang%2: #if it is odd\\r\\n    print lines[-1].replace('\\\\n', '')\\r\\n```\\r\\n\\r\\n\\r\\nYang pada hasil endingnya adalah menjadi seperti ini:\\r\\n\\r\\n```\\r\\naf Afrikaans   ko Korean   ht Haitian\\r\\nsq Albanian     lo Lao      ha Hausa\\r\\nar Arabic   la Latin    iw Hebrew\\r\\nhy Armenian     lv Latvian  hi Hindi\\r\\naz Azerbaijani  lt Lithuanian   hu Hungarian\\r\\neu Basque   mk Macedonian   is Icelandic\\r\\nbe Belarusian   mg Malagasy     ig Igbo\\r\\nbn Bengali  ms Malay    id Indonesian\\r\\nbs Bosnian  ml Malayalam    ga Irish\\r\\nbg Bulgarian    mt Maltese  it Italian\\r\\nca Catalan  mi Maori    ja Japanese\\r\\nny Chichewa     mr Marathi  jw Javanese\\r\\nzh -CNChinese   mn Mongolian    kn Kannada\\r\\nzh -TWChinese   my Myanmar  kk Kazakh\\r\\nhr Croatian     ne Nepali   km Khmer\\r\\ncs Czech    no Norwegian    ko Korean\\r\\n....etc\\r\\n```\\r\\n\\r\\n\\r\\nNaah demikianlah dokumentasi singkat dari proses pembuatan **_Project Python Google Translate_**, jika dirasakan orang yang baru mengenal python seperti saya, rasanya sangat puas apabila sukses membuat program sesuai dengan apa yang kita inginkan.. ![laugh](https://python.web.id/static/ckeditor/ckeditor/plugins/smiley/images/teeth_smile.png \\\"laugh\\\")\",\n            \"keywords\": \"Project Python Google Translate, Python Google Translate, Google Translate, Python, python translator\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 77,\n            \"absolute_url\": \"/posts/detail/backup-and-restore-database-postgres-django-in-terminal-ssh/\",\n            \"created_at\": \"2020-10-10T10:42:40.514755\",\n            \"updated_at\": \"2020-10-10T10:42:40.522700\",\n            \"title\": \"Backup and Restore database Postgres Django in terminal ssh\",\n            \"slug\": \"backup-and-restore-database-postgres-django-in-terminal-ssh\",\n            \"description\": \"Backup and Restore database Postgres Django in terminal ssh. Bismillahirrahmanirrahim, malam hari ini kita akan berbagi sedikit tutorial yang diambil dari dokumentasi saya pribadi mengenai problem solved backup and restore database postgres django, yaitu tepatnya ketika sudah dalam keadaan di hosting.\\r\\n\\r\\nBeberapa tutorial telah dicoba satu-satu, dan alhamdulillah masih gagal, lalu bertanya-tanya kepada kang _**Fendi**_, alhamdulillah solved dalam menangani backup'nya. Hal ini saya lakukan karena pindah hosting ke [HelloWorldHost.com](https://helloworldhost.com) - punya'nya mas Hafidz.\\r\\n\\r\\n***)** Pastikan anda saat ini dalam keadaan mengakses ssh server hosting anda. biasanya seperti ini:  \\r\\n\\r\\n\\r\\n```\\r\\n$ ssh {user}@{ip_server} -p {port}\\r\\n```\\r\\n\\r\\n\\r\\n**Backup:**\\r\\n\\r\\n\\r\\n```\\r\\n$ pg_dump -U {db_user} {db_name} -f backup.db -h 127.0.0.1\\r\\n```\\r\\n\\r\\n**Restore:**\\r\\n\\r\\n\\r\\n```\\r\\n$ psql -U {db_user} -d {db_name} -f backup.db -h 127.0.0.1\\r\\n```\\r\\n\\r\\n\\r\\n***)** untuk restore, mohon perhatikan dimana file `backup.db` berada, dan pastikan sudah mengupload filenya dihosting.\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"Backup and Restore database Postgres Django in terminal ssh, Backup and Restore database Postgres Django, backup postgres, restore postgres\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 76,\n            \"absolute_url\": \"/posts/detail/manfaatkan-fungsi-cat-terminal-di-python/\",\n            \"created_at\": \"2020-10-10T10:42:40.499139\",\n            \"updated_at\": \"2020-10-10T10:42:40.506658\",\n            \"title\": \"Manfaatkan Fungsi Cat Terminal di Python\",\n            \"slug\": \"manfaatkan-fungsi-cat-terminal-di-python\",\n            \"description\": \"Manfaatkan Fungsi Cat Terminal di Python – Fungsi Cat pada Terminal Linux (Ubuntu Misalnya) adalah merupakan fungsi untuk melihat isi dari sebuah file.\\r\\n\\r\\nDan Python adalah salah satu bahasa pemrograman yang memiliki function lebih, oleh karena itu dalam melihat file tentunya tidaklah menjadi masalah pada python sendiri.\\r\\n\\r\\nNamun pada bahasan kali ini, kita sedikit mengulik daripada Fungsi Cat dari Terminal yang juga dapat kita aplikasikan kedalam Python Programming.\\r\\n\\r\\nDimana pada script kali ini, ada 2 versi yang kita buat. Yaitu dengan mengandalkan user untuk menginputkan filename beserta ekstensinya. dan yang kedua dengan menggunakan function `**main**`.\\r\\n\\r\\nAdapun pada versi yang pertama, kita tidak perlu menggunakan module sys. namun pada versi yang kedua, kita membutuhkan module `sys` sebagai functional pada function `main()` nantinya.\\r\\n\\r\\nUntuk Versi 1, Contoh scriptnya seperti ini.\\r\\n\\r\\n```\\r\\ndef Cat(filename):\\r\\n    try:\\r\\n        f = open(filename)\\r\\n        text = f.read()\\r\\n        print 'Ini Adalah FIle: ', filename, 'n'\\r\\n        print text\\r\\n\\r\\n    except IOError:\\r\\n        print 'I/O Noting', filename\\r\\n\\r\\ninp = raw_input('Enter Filename: ')\\r\\nprint Cat(inp)\\r\\n```\\r\\n\\r\\n\\r\\nAdapun Outputnya kurang lebih seperti ini:\\r\\n\\r\\n```\\r\\n>>> Enter Filename: style.css\\r\\nIni Adalah FIle:  style.css\\r\\nbody {\\r\\n     background: #fff;\\r\\n     color: #ddd;\\r\\n}\\r\\n>>> \\r\\n```\\r\\n\\r\\n\\r\\nPenjelasan singkat, dalam script diatas, kita sengaja menambahkan `Exception I/O Error`, hal ini dilakukan agar apabila terjadi kesalahan/file yang di inputkan tidak ada maka program akan memberitahu bahwa Input file tidak ada.\\r\\n\\r\\nBagaimana dengan yang menggunakan function `**main**` ? Jika kita ingin menambahkan function `**main**`, maka kita butuh penambahan module yang berupa `sys`.\\r\\n\\r\\ndan Versi 2, Scripnya kurang lebih seperti ini:\\r\\n\\r\\n\\r\\n```\\r\\nimport sys\\r\\n\\r\\ndef Cat(filename):\\r\\n    try:\\r\\n        f = open(filename)\\r\\n        text = f.read()\\r\\n        print 'Ini Adalah FIle: ', filename, '\\\\n'\\r\\n        print text\\r\\n    except IOError:\\r\\n        print 'I/O Noting', filename\\r\\n\\r\\n\\r\\ndef main():\\r\\n    args = sys.argv[1:]\\r\\n    for arg in args:\\r\\n        Cat(arg)\\r\\n\\r\\n\\r\\nif name == 'main':\\r\\n    main()\\r\\n```\\r\\n\\r\\n\\r\\nAdapun untuk pemanggilannya sendiri, jika dalam Terminal kurang lebih seperti ini:\\r\\n\\r\\n\\r\\n```\\r\\n$ python cat.py style.css\\r\\n```\\r\\n\\r\\n\\r\\nDan ini adalah hasilnya:\\r\\n\\r\\nIni Adalah FIle:  _**style.css **_\\r\\n\\r\\n\\r\\n```\\r\\nbody { background: #fff; color: #ddd; }\\r\\n```\\r\\n\\r\\n\\r\\nAtau juga kita dapat men-`CAT` banyak file sekaligus.\\r\\n\\r\\n\\r\\n```\\r\\n$ python cat.py style.css cat.py filename-mu.txt\\r\\n```\\r\\n\\r\\n\\r\\nYah berikut tadi merupakan sedikit ulasan mengenai Pemanfaatan Fungsi Cat Terminal pada Python.\",\n            \"keywords\": \"Manfaatkan Fungsi Cat Terminal di Python, Fungsi Cat Terminal di Python, python, terminal, sys, read file with python\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 75,\n            \"absolute_url\": \"/posts/detail/update-about-author-django-blog-python-learning-v2/\",\n            \"created_at\": \"2020-10-10T10:42:40.482566\",\n            \"updated_at\": \"2020-10-10T10:42:40.490535\",\n            \"title\": \"[ update about author ] Django Blog Python Learning v.2\",\n            \"slug\": \"update-about-author-django-blog-python-learning-v2\",\n            \"description\": \"[ update about author ] Django Blog Python Learning v.2, bismillahirrahmanirrahim. Kali ini kita akan share update terbaru dari source code Django Blog Python Learning v.2 ini.\\r\\n\\r\\nYaitu **Update About Author** yang ada di setiap posts, bisa dilihat langsung dibawah posts ini. Lalu mana yang kita update?\\r\\n\\r\\n**1.** Pada bagian `blog/models.py` ditambahkan 1 field baru berupa `avatar`, seperti dibawah ini:\\r\\n\\r\\n\\r\\n```\\r\\nclass Author(models.Model):\\r\\n    name = models.CharField(max_length=200)\\r\\n    avatar = models.ImageField(upload_to='gallery', null=True, blank=True, help_text=\\\"Upload Image for Avatar\\\")\\r\\n    about = models.TextField(blank=True, null=True)\\r\\n    email = models.EmailField(max_length=200, blank=True, null=True, unique=True)\\r\\n    website = models.URLField(max_length=200, blank=True, null=True)\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Menampilkan **About Author** di template `posts.html`. Untuk letaknya tepat dibawah `{{ object.body|markdown }}`.\\r\\n\\r\\n```\\r\\n<div class=\\\"panel panel-default\\\">\\r\\n <div class=\\\"panel-heading\\\">Author</div>\\r\\n  <div class=\\\"panel-body\\\">\\r\\n    <div class=\\\"media\\\">\\r\\n      <div class=\\\"media-left media-middle\\\" style=\\\"float:left;margin-right:10px;\\\">\\r\\n        <a href=\\\"{{ entry.author.website }}\\\">\\r\\n          <img class=\\\"media-object\\\" alt=\\\"{{ entry.author.name }}\\\" title=\\\"{{ entry.author }}\\\" src=\\\"/media/{{ entry.author.avatar }}\\\" style=\\\"width:64px;height:64px;\\\">\\r\\n        </a>\\r\\n      </div>\\r\\n      <div class=\\\"media-body\\\">\\r\\n        <h4 class=\\\"media-heading\\\">{{ entry.author }}</h4>\\r\\n        {{ entry.author.about }}<br />\\r\\n          Website: <a href=\\\"{{ entry.author.website }}\\\" target=\\\"_blank\\\">{{ entry.author.website }}</a>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n```\\r\\n\\r\\n\\r\\nJika kurang jelas, bisa langsung kita lihat update'nya di github:\\r\\n\\r\\nUpdate `models.py`, [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/90a2263db14aa26645124ad0a561ee89b8567bc7](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/90a2263db14aa26645124ad0a561ee89b8567bc7 \\\"update models.py\\\")\\r\\n\\r\\nUpdate `post.html`, [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/b76b2812535da134e57708f0663bca5c43b3d0a7](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/b76b2812535da134e57708f0663bca5c43b3d0a7 \\\"update post.html\\\")\",\n            \"keywords\": \"[ update about author ] Django Blog Python Learning v.2, Django Blog Python Learning v.2, about author django, django blog\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 74,\n            \"absolute_url\": \"/posts/detail/update-pagination-sitemap-page-django-blog-python-learning-v2/\",\n            \"created_at\": \"2020-10-10T10:42:40.467224\",\n            \"updated_at\": \"2020-10-10T10:42:40.473905\",\n            \"title\": \"[ update pagination sitemap page ] Django Blog Python Learning v.2\",\n            \"slug\": \"update-pagination-sitemap-page-django-blog-python-learning-v2\",\n            \"description\": \"[ update pagination sitemap page ] Django Blog Python Learning v.2, bismillahirrahmanirrahim, pada kesempatan kali ini kita update lagi, setelah sebelumnya _update about author_, kali ini kita akan update lagi berupa **pagination sitemap page**.\\r\\n\\r\\nMengapa hal tersebut dilakukan? yap, karena seiring dengan adanya kemungkinan jumlah posts semakin besar, oleh karena memungkinkan pula scroll pada bowser akan semakin kecil karena banyak. oleh karena itu ada baiknya kita tambah sedikit menjadi pagination.\\r\\n\\r\\nSecara konsep sebenarnya sama seperti membuat pagination pada \\\"display al article under tag\\\", ataupun \\\"results query\\\". Lalu manakah yang kita ubah?\\r\\n\\r\\n**1.** Mengganti satu function `my_sitemap(request):` pada `myproject/views.py` menjadi seperti ini:\\r\\n\\r\\n```\\r\\ndef my_sitemap(request):\\r\\n    t = loader.get_template('sitemap.html')\\r\\n    all_entry = Entry.objects.all()\\r\\n    paginator = Paginator(all_entry, 10) #show 10 articles per page\\r\\n    page = request.GET.get('page')\\r\\n    try:\\r\\n        all_entry = paginator.page(page)\\r\\n    except PageNotAnInteger:\\r\\n        all_entry = paginator.page(1)\\r\\n    except EmptyPage:\\r\\n        all_entry = paginator.page(paginator.num_pages)\\r\\n    index = all_entry.number - 1\\r\\n    limit = 3 #limit for show range left and right of number pages\\r\\n    max_index = len(paginator.page_range)\\r\\n    start_index = index - limit if index >= limit else 0\\r\\n    end_index = index + limit if index <= max_index - limit else max_index\\r\\n    page_range = paginator.page_range[start_index:end_index]\\r\\n    c = Context({'all_entry':all_entry, 'page_range': page_range, })\\r\\n    return HttpResponse(t.render(c))\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Menambahkan pagination pada template `sitemap.html` yang letaknya tepat sebelum `{% endblock %}`untuk `{% block blog_entries %}`, atau dibawah end tag dari `<div class=\\\"post sitemap\\\">`.\\r\\n\\r\\n```\\r\\n<ul class=\\\"pagination\\\">\\r\\n  <li {% if not all_entry.has_previous %}class=\\\"disabled\\\"{% endif %}>\\r\\n     <a {% if all_entry.has_previous %}href=\\\"?page={{ all_entry.previous_page_number }}\\\" aria-label=\\\"Previous\\\" {% endif %}><span aria-hidden=\\\"true\\\">«</span></a>\\r\\n   </li>\\r\\n   <li><a href=\\\"?page=1\\\">First</a></li>\\r\\n  {% for linkpage in page_range %}\\r\\n      {% ifequal linkpage all_entry.number %}\\r\\n         <li class=\\\"active\\\">\\r\\n           <a href=\\\"#\\\">{{ all_entry.number }}<span class=\\\"sr-only\\\">(current)</span></a>\\r\\n         </li>\\r\\n      {% else %}\\r\\n         <li><a href=\\\"?page={{ linkpage }}\\\">{{ linkpage }}</a></li>\\r\\n      {% endifequal %}\\r\\n  {% endfor %}\\r\\n  <li><a href=\\\"?page={{ all_entry.paginator.num_pages }}\\\">Last</a></li>\\r\\n  <li {% if not all_entry.has_next %}class=\\\"disabled\\\"{% endif %}>\\r\\n     <a {% if all_entry.has_next %}href=\\\"?page={{ all_entry.next_page_number }}\\\" aria-label=\\\"Next\\\" {% endif %}><span aria-hidden=\\\"true\\\">»</span></a>\\r\\n   </li>\\r\\n</ul>\\r\\n```\\r\\n\\r\\n\\r\\nKeduanya jika masih bingung, di github juga kita update:\\r\\n\\r\\nUpdate `myproject/views.py`: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7026abbc22f8a14f3e130aec618c0ce3370f0a63](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7026abbc22f8a14f3e130aec618c0ce3370f0a63 \\\"update views.py\\\")\\r\\n\\r\\nUpdate `sitemap.html`: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/dd272f1f3892418e2886b81dc5f67c9a3d0a5b71](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/dd272f1f3892418e2886b81dc5f67c9a3d0a5b71 \\\"update sitemap.html\\\")\\r\\n\\r\\nJika terjadi problem, bisa langsung ditanyakan pada komentar dibawah. Semoga bermanfaat.\",\n            \"keywords\": \"[ update pagination sitemap page ] Django Blog Python Learning v.2, pagination sitemap page, pagination sitemap page django, django pagination, sitemap, django, Django Blog Python Learning\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 73,\n            \"absolute_url\": \"/posts/detail/download-29-script-dari-disk-buku-dasar-pemrograman-python/\",\n            \"created_at\": \"2020-10-10T10:42:40.452117\",\n            \"updated_at\": \"2020-10-10T10:42:40.462698\",\n            \"title\": \"Download 29 Script dari Disk Buku Dasar Pemrograman Python\",\n            \"slug\": \"download-29-script-dari-disk-buku-dasar-pemrograman-python\",\n            \"description\": \"Download 29 Script dari Disk Buku Dasar Pemrograman Python yang ditulis oleh Abdul Kadir. Beberapa tahun lalu saya membeli salah satu dasar pemrograman Python yang ditulis oleh Abdul Kadir, dan kali ini kita akan share 29 Script Python for Beginner yang ada didalam Disk'nya.\\r\\n\\r\\nApa saja yang ada didalamnya? Didalamnya meliputi:\\r\\n\\r\\n```\\r\\n1. argv.py  \\r\\n2. format.py  \\r\\n3. bacafile.py  \\r\\n4. bacapeg.py  \\r\\n5. pertama.py  \\r\\n6. skor.py  \\r\\n7. lintasan.py  \\r\\n8. hitbil.py  \\r\\n9. assert2.py  \\r\\n10. input2.py  \\r\\n11. kopifile.py  \\r\\n12. simppeg.py  \\r\\n13. jumlah.py  \\r\\n14. segitiga.py  \\r\\n15. tesprint.py  \\r\\n16. cari.py  \\r\\n17. infofile.py  \\r\\n18. stdin.py  \\r\\n19. frekkar.py  \\r\\n20. hitluas.py  \\r\\n21. lebar.py  \\r\\n22. assert.py  \\r\\n23. infowaktu.py  \\r\\n24. jumlah2.py  \\r\\n25. lat1.py  \\r\\n26. final.py  \\r\\n27. lulus.py  \\r\\n28. cekpar.py  \\r\\n29. input.py\\r\\n```\\r\\n\\r\\n\\r\\nSemoga dengan adanya beberapa contoh script diatas dapat membantu bagi anada yang saat ini ingin mempelajari bahasa pemgrograman Python.\\r\\n\\r\\n[Download Script](https://python.web.id/media/files/Skrip.zip)\",\n            \"keywords\": \"Download 29 Script dari Disk Buku Dasar Pemrograman Python, Download 29 Script Python, Dasar Pemrograman Python, Script Python\",\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 72,\n            \"absolute_url\": \"/posts/detail/pylinux-commands-help-v02/\",\n            \"created_at\": \"2020-10-10T10:42:40.439032\",\n            \"updated_at\": \"2020-10-10T10:42:40.447872\",\n            \"title\": \"pyLinux Commands Help v0.2\",\n            \"slug\": \"pylinux-commands-help-v02\",\n            \"description\": \"**pyLinux Commands Help** merupakan salah satu repository open source yang dikembangkan untuk membantu mengenai penanganan Commands Linux bagi pemula.\\r\\n\\r\\nIde ini muncul karena banyaknya teman-teman yang ada disekitar saya yang masih kebingungan dalam hal Commands Linux. Padahal Linux Sendiri telah menyediakan **_\\\"Help\\\"_**.\\r\\n\\r\\nNamun dengan demikian, pyLinux Commands Help versi 0.2 dibuat dengan 3 Library sekaligus, diantaranya seperti:\\r\\n\\r\\n1.  Indonesian Linux Commands\\r\\n2.  Kali Linux Commands, dan\\r\\n3.  Linux English Commands\\r\\n\\r\\nAdapun penggunaanya sangat mudah, karena memang sengaja didesign untuk memudahkan para pemula Linux, dalam commands terminal linux (khususnya).\\r\\n\\r\\n### Requirements\\r\\n\\r\\n*   Menggunakan Operating System Linux, atau Mac OSX\\r\\n*   Python2.7 (default os linux) seluruhnya sudah ada python, jadi tidak perlu menginstall.\\r\\n\\r\\n### Before Use\\r\\n\\r\\nSebelum menggunakannya, ada 2 methode yang dapat kita gunakan, yaitu:\\r\\n\\r\\n1.  **Download langsung zip file repository complete.**\\r\\n    *   Mendownload file'nya disini: [https://github.com/agusmakmun/py-Linux-Commands-Help/archive/master.zip](https://github.com/agusmakmun/py-Linux-Commands-Help/archive/master.zip)\\r\\n    *   Extract.\\r\\n2.  **Membuat 4 file dan 1 folder**, seperti dibawah ini, atau dapat melihat langsung di [github.com](https://github.com/agusmakmun/py-Linux-Commands-Help/tree/master/v0.2) yang versi 0.2\\r\\n    *   [help.py](https://github.com/agusmakmun/py-Linux-Commands-Help/blob/master/v0.2/help.py) --> digunakan untuk meletakkan script python'nya.\\r\\n    *   buat folder bernama: **library**\\r\\n    *   buat beberapa file benama:\\r\\n        *   [indonesian linux commands.txt](https://github.com/agusmakmun/py-Linux-Commands-Help/blob/master/v0.2/library/indonesian linux commands.txt)\\r\\n        *   [kali linux commands.txt](https://github.com/agusmakmun/py-Linux-Commands-Help/blob/master/v0.2/library/kali linux commands.txt)\\r\\n        *   [linux commands.txt](https://github.com/agusmakmun/py-Linux-Commands-Help/blob/master/v0.2/library/linux commands.txt)\\r\\n\\r\\n### How to Use ?\\r\\n\\r\\nMasuk ke directory dimana file: help.py berada. misalkan seperti gambar dibawah ini:\\r\\n\\r\\n![pyLinux Commands Help v0.2](https://python.web.id/media/gallery/pyLinux_Commands_Help2.png \\\"pyLinux Commands Help v0.2\\\")\\r\\n\\r\\ndan setelah dipastikan file help.py ada, silahkan ketikkan: `$ python help.py`, seperti gambar dibawah ini:\\r\\n\\r\\n![pyLinux Commands Help v0.2](https://python.web.id/media/gallery/pyHelp_Commands_Linux.png \\\"pyLinux Commands Help v0.2\\\")\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"pyLinux Commands Help, Linux Commands Help, pyLinux Commands, help terminal, foss, linux commands\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 71,\n            \"absolute_url\": \"/posts/detail/beberapa-methode-sorting-dalam-python/\",\n            \"created_at\": \"2020-10-10T10:42:40.424273\",\n            \"updated_at\": \"2020-10-10T10:42:40.433727\",\n            \"title\": \"Beberapa Methode Sorting dalam Python\",\n            \"slug\": \"beberapa-methode-sorting-dalam-python\",\n            \"description\": \"Beberapa Methode Sorting dalam Python, Ada beberapa Metode Sorting dalam Python yang dapat kita gunakan, biasanya methode ini digunakan untuk mencari suatu data tertentu dengan menggunakan methode sorting (pengurutan), diantaranya yang paling popular adalah Bubble Sort, Quick Search, dan lain-lain.\\r\\n\\r\\nDalam artikel kali ini kita akan share setidaknya ada 6 Methode Sorting dalam Python yang dapat kita gunakan.\\r\\n\\r\\n**1.** Buble Sort, Nilai terbesar dibawa ke kanan.\\r\\n\\r\\n```\\r\\ndef bubbleSort(alist):\\r\\n    for passnum in range(len(alist)-1,0,-1):\\r\\n        for i in range(passnum):\\r\\n            if alist[i]>alist[i+1]:\\r\\n                temp = alist[i]\\r\\n                alist[i] = alist[i+1]\\r\\n                alist[i+1] = temp\\r\\n\\r\\nalist = [54,26,93,17,77,31,44,55,20]\\r\\nbubbleSort(alist)\\r\\nprint(alist)\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Method Short Buble\\r\\n\\r\\n```\\r\\ndef shortBubbleSort(alist):\\r\\n    exchanges = True\\r\\n    passnum = len(alist)-1\\r\\n    while passnum > 0 and exchanges:\\r\\n       exchanges = False\\r\\n       for i in range(passnum):\\r\\n           if alist[i]>alist[i+1]:\\r\\n               exchanges = True\\r\\n               temp = alist[i]\\r\\n               alist[i] = alist[i+1]\\r\\n               alist[i+1] = temp\\r\\n       passnum = passnum-1\\r\\n\\r\\nalist=[20,30,40,90,50,60,70,80,98]\\r\\nshortBubbleSort(alist)\\r\\nprint(alist)\\r\\n```\\r\\n\\r\\n\\r\\n**3.** Metode pencarian Seperti Permainan Turnamen\\r\\n\\r\\n```\\r\\ndef selectionSort(alist):\\r\\n   for fillslot in range(len(alist)-1,0,-1):\\r\\n       positionOfMax=0\\r\\n       for location in range(1,fillslot+1):\\r\\n           if alist[location]>alist[positionOfMax]:\\r\\n               positionOfMax = location\\r\\n\\r\\n       temp = alist[fillslot]\\r\\n       alist[fillslot] = alist[positionOfMax]\\r\\n       alist[positionOfMax] = temp\\r\\n\\r\\nalist = [54,26,93,17,77,31,44,55,20]\\r\\nselectionSort(alist)\\r\\nprint(alist)\\r\\n```\\r\\n\\r\\n\\r\\n**4.** Metode Search dengan cara menyisipkan\\r\\n\\r\\n```\\r\\ndef insertionSort(alist):\\r\\n   for index in range(1,len(alist)):\\r\\n\\r\\n     currentvalue = alist[index]\\r\\n     position = index\\r\\n\\r\\n     while position>0 and alist[position-1]>currentvalue:\\r\\n         alist[position]=alist[position-1]\\r\\n         position = position-1\\r\\n\\r\\n     alist[position]=currentvalue\\r\\n\\r\\nalist = [54,26,93,17,77,31,44,55,20]\\r\\ninsertionSort(alist)\\r\\nprint(alist)\\r\\n```\\r\\n\\r\\n\\r\\n**5.** Methode Search dengan cara shell Sort\\r\\n\\r\\n```\\r\\ndef shellSort(alist):\\r\\n    sublistcount = len(alist)//2\\r\\n    while sublistcount > 0:\\r\\n\\r\\n      for startposition in range(sublistcount):\\r\\n        gapInsertionSort(alist,startposition,sublistcount)\\r\\n\\r\\n      print(\\\"After increments of size\\\",sublistcount,\\r\\n                                   \\\"The list is\\\",alist)\\r\\n\\r\\n      sublistcount = sublistcount // 2\\r\\n\\r\\ndef gapInsertionSort(alist,start,gap):\\r\\n    for i in range(start+gap,len(alist),gap):\\r\\n\\r\\n        currentvalue = alist[i]\\r\\n        position = i\\r\\n\\r\\n        while position>=gap and alist[position-gap]>currentvalue:\\r\\n            alist[position]=alist[position-gap]\\r\\n            position = position-gap\\r\\n\\r\\n        alist[position]=currentvalue\\r\\n\\r\\nalist = [54,26,93,17,77,31,44,55,20]\\r\\nshellSort(alist)\\r\\nprint(alist)\\r\\n```\\r\\n\\r\\n\\r\\n**6.** Methode Quick Search, Menurut saya ini yang paling efektif pencariannya.\\r\\n\\r\\n```\\r\\ndef quickSort(alist):\\r\\n   quickSortHelper(alist,0,len(alist)-1)\\r\\n\\r\\ndef quickSortHelper(alist,first,last):\\r\\n   if first= pivotvalue and \\r\\n               rightmark >= leftmark:\\r\\n           rightmark = rightmark -1\\r\\n\\r\\n       if rightmark < leftmark:\\r\\n           done = True\\r\\n       else:\\r\\n           temp = alist[leftmark]\\r\\n           alist[leftmark] = alist[rightmark]\\r\\n           alist[rightmark] = temp\\r\\n\\r\\n   temp = alist[first]\\r\\n   alist[first] = alist[rightmark]\\r\\n   alist[rightmark] = temp\\r\\n\\r\\n   return rightmark\\r\\n\\r\\nalist = [54,26,93,17,77,31,44,55,20]\\r\\nquickSort(alist)\\r\\nprint(alist)\\r\\n```\\r\\n\\r\\n\\r\\n\\r\\nSource: interactivepython.org\",\n            \"keywords\": \"Methode Sorting dalam Python, Buble Sort, Method Short Buble, Selection Sort, Insertion Sort, Shell Sort, Quick Sort\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 70,\n            \"absolute_url\": \"/posts/detail/update-display-post-under-author-django-blog-python-learning-v2/\",\n            \"created_at\": \"2020-10-10T10:42:40.408135\",\n            \"updated_at\": \"2020-10-10T10:42:40.417870\",\n            \"title\": \"[ update display post under author ] Django Blog Python Learning v.2\",\n            \"slug\": \"update-display-post-under-author-django-blog-python-learning-v2\",\n            \"description\": \"[ update display post under author ] Django Blog Python Learning v.2, bismillahhirrahmanirrahim. Selamat sore sobat, sudah 2x kita update mengenai Django Blog Python Learning v.2 ini.\\r\\n\\r\\nDan pada kesempatan sore hari ini, kita akan update mengenai `Display Article under Author`, beberapa clue yang sempat saya fikirkan adalah membuat field baru lagi di class `Author` pada `blog/models.py`, yaitu berupa `slug_filed` untuk author. Dan ending yang di inginkan menjadi kurang lebih seperti ini: `python.web.id/author/<author_name>`.\\r\\n\\r\\nNamun setelah berfikir kembali, sepertinya itu akan lebih membutuhkan proses yang njelimet. hehe.. Karena selain `makemigrations & migrate`, kita juga mensetting di beberapa bagian guna penampilan `slug_field` tersebut.\\r\\n\\r\\nNah, pada akhirnya, kami putuskan untuk mengambil salah satu function berupa `get_absolute_url(self):` yang merupakan turunan dari class yang telah kita buat di `blog/models.py`, misalkan seperti ini:\\r\\n\\r\\n```\\r\\n>>> from blog.models import Entry\\r\\n>>> dir(Entry)\\r\\n['DoesNotExist', ..... , 'get_absolute_url', 'get_deferred_fields', 'get_next_by_created', 'get_next_by_modified', 'get_previous_by_created', ...... ]\\r\\n>>>\\r\\n>>>\\r\\n```\\r\\n\\r\\n**Lalu URL apa yang kita gunakan?**\\r\\n\\r\\nKita memanfaatkan `pk` [ primary key ] atau `id` dari Author. yang endingnya digunakan sebagai opsi pengganti dari `slug_field`. Dan jika diterapkan menjadi seperti ini: `python.web.id/author/<pk>` [ `pk` berupa number ].\\r\\n\\r\\n**Kemudian mana yang kita rubah dan tambah?**\\r\\n\\r\\nUntuk perubahan setidaknya ada 6 perubahan, dan 1 penambahan template berupa `all_tags.html`.\\r\\n\\r\\n**1.** Penambahan function berupa `get_absolute_url(self):` pada `class Author` di `blog/models.py`, ini digunakan untuk pengambilan `<pk>` sebagai absolute url, bisa dilihat disini perubahannya: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/55e9792baff6039f9292773432ea29122c252b89](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/55e9792baff6039f9292773432ea29122c252b89)\\r\\n\\r\\n**2.** Penambahan function baru berupa `displayArticleUnderAuthor(request, pk):` pada `myproject/views.py`. bisa dilihat disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7bc87c58ca02e4c332a91c90399f95816af50245](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7bc87c58ca02e4c332a91c90399f95816af50245)\\r\\n\\r\\n**3.** Penambahan url baru pada `myproject/urls.py` untuk memanggil functionnya di urls, dan itu bisa dilihat disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/652c7b174c6963ee8602f25be0c38e81eafe1612](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/652c7b174c6963ee8602f25be0c38e81eafe1612)\\r\\n\\r\\n**4.** Membuat [ template ] baru berupa `post_author.html` pada directory `templates/post_author.html`, ini digunakan sebagai template untuk menampilkan post under author, bisa dilihat disini scriptnya: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/16bffdf2c04fce04960fb3ae2f02e55c8861c21d](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/16bffdf2c04fce04960fb3ae2f02e55c8861c21d)\\r\\n\\r\\n**5.** Perubahan pada template `home.html` yaitu yang awalnya `{{ object.author }}` menjadi `<a href=\\\"/author/{{ object.author.pk }}\\\">{{ object.author }}</a>`, ini dilakukan agar author menjadi link yang menuju ke author url. Untuk perubahannya bisa dilihat disini detailnya: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/56a1363250c1866c3244c2c6dcdc590e38ae6114](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/56a1363250c1866c3244c2c6dcdc590e38ae6114)\\r\\n\\r\\n**6.** Sama halnya seperti pada perubahan yang ke-5, yaitu hanya perubahan sedikit pada `author`, kali ini untuk template `post.html`, kemarin kan kita update mengenai display author di post, nah ini pada bagian `<a href=\\\"{{ entry.author.website }}\\\">` diganti menjadi `<a href=\\\"{{ object.author.pk }}\\\">`, tujuannya ketika di click avatar/foto'nya akan menuju ke post under author. Selengkapnya bisa dilihat disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/e19f09d8cc754dc6cc696621078b97cb22a8f182](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/e19f09d8cc754dc6cc696621078b97cb22a8f182)\\r\\n\\r\\n**7.** Sama lagi, hanya perubahan sedikit pada `author` di template `result.html`, yang awalnya hanya `{{ objcet.author }}` dirubah menjadi `<a href=\\\"/author/{{ object.author.pk }}\\\">{{ object.author }}</a>`, lihat selengkapnya disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/da407579964867d65c94a877d24ef89dc5e054d3](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/da407579964867d65c94a877d24ef89dc5e054d3)\\r\\n\\r\\nBisa dilihat juga pada Commits on Sep 17, 2015 untuk melihat commits pada tanggal tersebut. [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commits/master](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commits/master)\\r\\n\\r\\nJika ada terjadi problem, bisa ditanyakan melalui comment dibawah ini, atau melalui report issues di [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/issues](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/issues \\\"Report Issues\\\")\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"[ update display post under author ] Django Blog Python Learning v.2, display post under author, display post under author django, post under author, django post author\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 69,\n            \"absolute_url\": \"/posts/detail/how-to-setup-postgresql-database-in-django/\",\n            \"created_at\": \"2020-10-10T10:42:40.396940\",\n            \"updated_at\": \"2020-10-10T10:42:40.402831\",\n            \"title\": \"How to setup PostgreSQL Database in Django\",\n            \"slug\": \"how-to-setup-postgresql-database-in-django\",\n            \"description\": \"How to setup PostgreSQL Database in Django, this night I wanna share simple tutorial how to setup PostgreSQL Database in Django. This problem has been asked and solved with user from [http://stackoverflow.com/a/5421511](http://stackoverflow.com/a/5421511)\\r\\n\\r\\n### Installation\\r\\n\\r\\nDownload [http://initd.org/psycopg/](http://initd.org/psycopg/ \\\"download psycopg\\\"), then install it under django & python PATH.\\r\\n\\r\\nAfter downloading, easily extract the tarball and:\\r\\n\\r\\n```\\r\\n$ python setup.py install\\r\\n```\\r\\n\\r\\n\\r\\nOr if you wish, at [command-line|console] install it by either easy_install or pip. _(I prefer to use pip over easy_install for no reason.)_\\r\\n\\r\\n```\\r\\n$ easy_install psycopg2\\r\\n```\\r\\n\\r\\nOr this:\\r\\n\\r\\n\\r\\n```\\r\\n$ pip install psycopg2\\r\\n```\\r\\n\\r\\n### Configuration\\r\\n\\r\\nin your `settings.py`, change default database `sqlite3` to this configuration.\\r\\n\\r\\n```\\r\\nDATABASES = {\\r\\n    'default': {\\r\\n        'ENGINE': 'django.db.backends.postgresql_psycopg2',\\r\\n        'NAME': 'db_name',                      \\r\\n        'USER': 'db_user',\\r\\n        'PASSWORD': 'db_user_password',\\r\\n        'HOST': '',\\r\\n        'PORT': 'db_port_number',\\r\\n    }\\r\\n}\\r\\n```\\r\\n\\r\\nHopefully can help..\",\n            \"keywords\": \"How to setup PostgreSQL Database in Django, setup PostgreSQL Database, PostgreSQL Django, Setup PostgreSQL\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 17,\n                    \"name\": \"database\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 68,\n            \"absolute_url\": \"/posts/detail/how-to-use-pillow-a-fork-of-pil/\",\n            \"created_at\": \"2020-10-10T10:42:40.383920\",\n            \"updated_at\": \"2020-10-10T10:42:40.389768\",\n            \"title\": \"How to use Pillow, a fork of PIL\",\n            \"slug\": \"how-to-use-pillow-a-fork-of-pil\",\n            \"description\": \"### Overview\\r\\n\\r\\nIn last post I was writing about PIL, also known as Python Imaging Library, this library can be used to manipulate images quite easy. PIL hasn't seen any development since 2009. Therefore, the kind users of this site suggested to take a look at Pillow. This article well tell you how to use Pillow.\\r\\n\\r\\n### What is Pillow?\\r\\n\\r\\nPillow is a fork of PIL (Python Image Library), started and maintained by Alex Clark and Contributors. It was based on the PIL code, and then evolved to a better, modern and more friendly version of PIL. It adds support for opening, manipulating, and saving many different image file formats. A lot of things work the same way as the original PIL.\\r\\n\\r\\n### Download and Installing Pillow\\r\\n\\r\\nBefore we start to use the Pillow, we must first download and install it. Pillow is available for Windows, Mac OS X and Linux. The most recent version is \\\"2.2.1\\\" and is supported by python 2.6 and above. To install Pillow on Windows machines you can use easy_install:\\r\\n\\r\\n```\\r\\n$ easy_install Pillow\\r\\n```\\r\\n\\r\\n\\r\\nTo install Pillow on Linux machines simply use:\\r\\n\\r\\n```\\r\\n$ sudo pip install Pillow\\r\\n```\\r\\n\\r\\n\\r\\nTo install Pillow on Mac OS X I had to first install XCode and then install the the prerequisites is via Homebrew. After Homebrew was installed, I ran:\\r\\n\\r\\n\\r\\n```\\r\\n$ brew install libtiff libjpeg webp littlecms\\r\\n$ sudo pip install Pillow\\r\\n```\\r\\n\\r\\nPlease let me know if you know an easier way to do this on Mac.\\r\\n\\r\\n### Verify that Pillow is installed\\r\\n\\r\\nTo verify that Pillow is installed, open up a Terminal and type in the following line:\\r\\n\\r\\n```\\r\\n$ python\\r\\nPython 2.7.5 (default, Aug 25 2013, 00:04:04)\\r\\n[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin\\r\\nType \\\"help\\\", \\\"copyright\\\", \\\"credits\\\" or \\\"license\\\" for more information.\\r\\n>>> from PIL import Image\\r\\n```\\r\\n\\r\\nIf the system comes back with a \\\">>>\\\", the Pillow modules are properly installed.\\r\\n\\r\\n### File formats\\r\\n\\r\\nBefore we start using the Pillow module, let us mention some of the filetypes that is supported. BMP EPS GIF IM JPEG MSP PCX PNG PPM TIFF WebP ICO PSD PDF Some of the file types, you only have the possibility to read, and others you can only write. To see the full list of supported file types, and more information about them, take a look at the handbook for Pillow.\\r\\n\\r\\n### How to use Pillow to manipulate an image\\r\\n\\r\\nSince we are going to work with images, let us first download one. If you already have a picture to use, go ahead and skip this step. In our example we will use a standard test image called \\\"Lenna\\\" or \\\"Lena\\\". That standard test image is used in many image processing experiment. Just go here and download the picture. If you click on the image, it will save it as an 512×512px image.\\r\\n\\r\\n### Using Pillow\\r\\n\\r\\nLet us look at the possible uses for this library. The basic functions are found in the Image module. You can create instances of this class in several ways either by loading images from files, processing other images, or creating images from scratch. Import the Pillow modules you want to use.\\r\\n\\r\\n```\\r\\nfrom PIL import Image\\r\\n\\r\\nYou can then access functions as usual, e.g.\\r\\n\\r\\nmyimage = Image.open(filename)\\r\\nmyimage.load()\\r\\n```\\r\\n\\r\\n### Load an Image\\r\\n\\r\\nTo load an image from your computer, you can use use \\\"open\\\" method to identify the file, and then load the identified file using myfile.load(). Once the image is loaded, you can do a number of things with it. I often use the try/except block when dealing with files. To load our image using try/except:\\r\\n\\r\\n```\\r\\nfrom PIL import Image, ImageFilter\\r\\ntry:\\r\\n    original = Image.open(\\\"Lenna.png\\\")\\r\\nexcept:\\r\\n    print \\\"Unable to load image\\\"\\r\\n```\\r\\n\\r\\nWhen we read files from disk using the open() function, we don't have to know the format of the file to. The library automatically determines the format based on the contents of the file. Now when you have an Image object, you can use the available attributes to examine the file. For example, if you want to see the size of the image, you can call the \\\"format\\\" attribute.\\r\\n\\r\\n```\\r\\nprint \\\"The size of the Image is: \\\"\\r\\nprint(original.format, original.size, original.mode)\\r\\n```\\r\\n\\r\\nThe \\\"size\\\" attribute is a 2-tuple containing width and height (in pixels). Common \\\"modes\\\" are \\\"L\\\" for greyscale images, \\\"RGB\\\" for true color images, and \\\"CMYK\\\" for pre-press images. The output of above should give you t\\r\\n\\r\\n\\r\\n```\\r\\nThe size of the Image is:\\r\\n('PNG', (512, 512), 'RGB')\\r\\n```\\r\\n\\r\\n\\r\\n### Blur an Image\\r\\n\\r\\nThis example will load an image from the hard drive and blurs it. [[source](http://en.wikipedia.org/wiki/Python_Imaging_Library \\\"source\\\")]\\r\\n\\r\\n```\\r\\n# Import the modules\\r\\nfrom PIL import Image, ImageFilter\\r\\n\\r\\ntry:\\r\\n    # Load an image from the hard drive\\r\\n    original = Image.open(\\\"Lenna.png\\\")\\r\\n\\r\\n    # Blur the image\\r\\n    blurred = original.filter(ImageFilter.BLUR)\\r\\n\\r\\n    # Display both images\\r\\n    original.show()\\r\\n    blurred.show()\\r\\n\\r\\n    # save the new image\\r\\n    blurred.save(\\\"blurred.png\\\")\\r\\n\\r\\nexcept:\\r\\n    print \\\"Unable to load image\\\"\\r\\n```\\r\\n\\r\\n\\r\\nThe blurred image should look like this:\\r\\n\\r\\n![Blurred](../../media/gallery/blurred.png \\\"Blurred\\\")\\r\\n\\r\\nTo display the image, we used the \\\"show()\\\" methods. If you don't see anything, you could try installing ImageMagick first and run the example again.\\r\\n\\r\\n### Creating Thumbnails\\r\\n\\r\\nA very common thing to do is creating thumbnails for images. Thumbnails are reduced-size versions of pictures but still contains all of the most important aspects of an image.\\r\\n\\r\\n```\\r\\nfrom PIL import Image\\r\\n\\r\\nsize = (128, 128)\\r\\nsaved = \\\"lenna.jpeg\\\"\\r\\n\\r\\ntry:\\r\\n    im =  Image.open(\\\"Lenna.png\\\")\\r\\nexcept:\\r\\n    print \\\"Unable to load image\\\"\\r\\n\\r\\nim.thumbnail(size)\\r\\nim.save(saved)\\r\\nim.show()\\r\\n```\\r\\n\\r\\n\\r\\nThe result of our program, showing the thumbnail:\\r\\n\\r\\n![Thumbnail](../../media/gallery/Thumbnail.png \\\"Thumbnail\\\")\\r\\n\\r\\n### Filters in Pillow\\r\\n\\r\\nThe Pillow module provides the following set of predefined image enhancement filters:\\r\\n\\r\\n```\\r\\nBLUR\\r\\nCONTOUR\\r\\nDETAIL\\r\\nEDGE_ENHANCE\\r\\nEDGE_ENHANCE_MORE\\r\\nEMBOSS\\r\\nFIND_EDGES\\r\\nSMOOTH\\r\\nSMOOTH_MORE\\r\\nSHARPEN\\r\\n```\\r\\n\\r\\nIn our last example for today, we will show how you can apply the \\\"contour\\\" filter to your image. The code below will take our image and apply.\\r\\n\\r\\n\\r\\n```\\r\\nfrom PIL import Image, ImageFilter\\r\\n\\r\\nim = Image.open(\\\"Lenna.png\\\")\\r\\nim = im.filter(ImageFilter.CONTOUR)\\r\\n\\r\\nim.save(\\\"lenna\\\" + \\\".jpg\\\")\\r\\nim.show()\\r\\n```\\r\\n\\r\\n\\r\\n![Filter](../../media/gallery/Filter.png \\\"Filter\\\")\\r\\n\\r\\nI enjoyed to try out Pillow, and I will write more posts about it in the future.  \\r\\nMore Reading.\\r\\n\\r\\n[http://pillow.readthedocs.org/en/latest/handbook/tutorial.html](http://pillow.readthedocs.org/en/latest/handbook/tutorial.html \\\"Pillow\\\")\\r\\n\\r\\nOriginal Post: http://www.pythonforbeginners.com/gui/how-to-use-pillow\",\n            \"keywords\": \"How to use Pillow, a fork of PIL, Python Pillow, Pillow\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 67,\n            \"absolute_url\": \"/posts/detail/making-simple-url-crawler-using-beautifulsoup/\",\n            \"created_at\": \"2020-10-10T10:42:40.373406\",\n            \"updated_at\": \"2020-10-10T10:42:40.379495\",\n            \"title\": \"Making simple Url Crawler using BeautifulSoup\",\n            \"slug\": \"making-simple-url-crawler-using-beautifulsoup\",\n            \"description\": \"Making simple Url Crawler using BeautifulSoup, Crawl adalah teknik yang biasa digunakan untuk mengambil sesuatu dalam website, dan dalam hal ini yang paling banyak digunakan adalah crawl `link`.\\r\\n\\r\\nLalu bagaimana dengan python? apakah python sendiri juga bisa digunakan untuk teknik crawling? Jawabannya adalah sangat bisa, beberapa tools pengembangan dari python yang terkenal seperti `scrapy`, `BeautifulSoup` dan masih banyak lainnya.\\r\\n\\r\\nPada artikel kali ini kita akan sedikit bahas secara singkat bagaimana sebenarnya teknik crawl tersebut dilakukan, dan bagaimana simple scriptnya.\\r\\n\\r\\nSalah satu module yang akan kita bahas kali ini yaitu module `BeautifulShoup`, jika dalam python2.7, seperti ini cara memanggilnya: `from bs4 import BeautifulSoup`.\\r\\n\\r\\nJika ingin tahu functions apa saja yang bisa digunakan, kita bisa melihatnya dengan teknik `dir(nama_module)`.\\r\\n\\r\\n```\\r\\n>>> from bs4 import BeautifulSoup\\r\\n>>> dir(BeautifulSoup)\\r\\n['DEFAULT_BUILDER_FEATURES', 'FORMATTERS', ......, 'string', 'strings', 'stripped_strings', 'tag_name_re', 'text', 'unwrap', 'wrap']\\r\\n>>>\\r\\n```\\r\\n\\r\\n\\r\\nSetidaknya ada banyak sekali function yang dapat kita gunakan. Mari kita lihat bagaimana penerapannya:\\r\\n\\r\\n```\\r\\nfrom bs4 import BeautifulSoup\\r\\nhtml = '''<a href=\\\"http://python.web.id\\\">Python Learning</a>\\r\\n<span class=\\\"class\\\"><a href=\\\"http://python.web.id/sample/\\\">Sample</a></span>'''\\r\\n\\r\\nsoup = BeautifulSoup(html)\\r\\nfor a in soup.findAll('a', href=True):\\r\\n    print a['href']\\r\\n```\\r\\n\\r\\n\\r\\nDan setelah kita execute, maka akan menghasilkan output berupa:\\r\\n\\r\\n```\\r\\n>>> \\r\\nhttp://python.web.id\\r\\nhttp://python.web.id/sample/\\r\\n>>> \\r\\n```\\r\\n\\r\\n\\r\\nTeknik diatas adalah merupakan teknik yang paling dasar untuk dapat meng-crawl sebuah url, dalam hal ini penerapannya masih dalam sebuah variable berupa string.\\r\\n\\r\\nBagaimana dengan cara crawl url yang sederhana di sebuah website?  \\r\\nUntuk mengakses sebuah website, kita membutuhkan salah satu module berupa `urllib`. Mari kita lihat script dibawah ini:\\r\\n\\r\\n\\r\\n```\\r\\nimport urllib\\r\\nfrom bs4 import BeautifulSoup\\r\\nurl = 'http://python.web.id'\\r\\nsoup = BeautifulSoup(url)\\r\\n\\r\\ndef crawl(url):\\r\\n    start = urllib.urlopen(url)\\r\\n    soup = BeautifulSoup(start)\\r\\n    for a in soup.findAll('a', href=True):\\r\\n        print a['href']\\r\\n\\r\\ncrawl(url)\\r\\n```\\r\\n\\r\\n\\r\\nSetelah di execute, maka akan menghasilkan seperti ini kurang lebihnya:\\r\\n\\r\\n\\r\\n```\\r\\n/\\r\\n/about/\\r\\n/sitemap/\\r\\n/resource/\\r\\n/contact/\\r\\n#nav-collapse3\\r\\n/blog/how-to-use-pillow-a-fork-of-pil/\\r\\n/author/1\\r\\n/tag/module\\r\\n/blog/how-to-use-pillow-a-fork-of-pil/\\r\\n/blog/how-setup-postgresql-database-in-django/\\r\\n/author/1\\r\\n/tag/django\\r\\n/tag/module\\r\\n/tag/settings\\r\\n/tag/database\\r\\n```\\r\\n\\r\\n\\r\\nTimbul pertanyaan, mengapa yang muncul tidak terdapat nama domainnya? misalkan `http://python.web.id/`. Ini disebabkan dari `BeautifulShoup`'nya yang mengidentifikasi isi dari variable `href` yang ada didalam tag `a`, yaitu di `soup.findAll('a', href=True):`.\\r\\n\\r\\nJika kita lakukan inspect element `F12`, atau View page source `CTRL+U` pada `http://python.web.id/`, maka bisa kita lihat banyak yang didalam `a href=\\\"` hanya terdapat kelanjutan dari slug.\\r\\n\\r\\nNah begitulah tadi teknik crawling sederhana dengan menggunakan module `BeautifulShoup` di Python.  \\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"BeautifulShoup, Making simple Url Crawler using BeautifulSoup, simple Url Crawl, crawl, simple script crawl, simple crawl, teknik crawl url\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 14,\n                    \"name\": \"grabber\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 66,\n            \"absolute_url\": \"/posts/detail/installing-module-pysensors-in-linux/\",\n            \"created_at\": \"2020-10-10T10:42:40.358999\",\n            \"updated_at\": \"2020-10-10T10:42:40.367584\",\n            \"title\": \"Installing Module PySensors in Linux\",\n            \"slug\": \"installing-module-pysensors-in-linux\",\n            \"description\": \"Installing Module PySensors in Linux, This package are shortcomings of scraping the output of the sensors command by different shell scripts. Some had problems when labels changed, others could not cope with too many matches of their overly broad regular expressions, and so on. Those scripts and thus this package are used at RebeIT for monitoring servers. The needs of that task are the driving force behind this implementation.\\r\\n\\r\\n### Installing PySensors\\r\\n\\r\\n**1.** You can download this module from pypi, [https://pypi.python.org/pypi/PySensors/](https://pypi.python.org/pypi/PySensors/ \\\"PySensors\\\")\\r\\n\\r\\n**2.** Extract files and Install module on command terminal like this:\\r\\n\\r\\n\\r\\n```\\r\\n$ cd /path/to/module && sudo python setup.py install\\r\\n```\\r\\n\\r\\n\\r\\n### Sample Usage\\r\\n\\r\\n\\r\\n```\\r\\nagaust@agaust:~$ python\\r\\nPython 2.7.6 (default, Jun 22 2015, 18:00:18) \\r\\n[GCC 4.8.2] on linux2\\r\\nType \\\"help\\\", \\\"copyright\\\", \\\"credits\\\" or \\\"license\\\" for more information.\\r\\n>>> import sensors\\r\\n>>> sensors.init()\\r\\n>>> try:\\r\\n...     for chip in sensors.iter_detected_chips():\\r\\n...         print '%s at %s' % (chip, chip.adapter_name)\\r\\n...         for feature in chip:\\r\\n...             print '  %s: %.2f' % (feature.label, feature.get_value())\\r\\n... finally:\\r\\n...     sensors.cleanup()\\r\\n... \\r\\nacpitz-virtual-0 at Virtual device\\r\\n  temp1: 57.00\\r\\ncoretemp-isa-0000 at ISA adapter\\r\\n  Physical id 0: 61.00\\r\\n  Core 0: 60.00\\r\\n  Core 1: 61.00\\r\\n>>>\\r\\n```\",\n            \"keywords\": \"Installing Module PySensors in Linux, PySensors, Installing Module PySensors\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 15,\n                    \"name\": \"module\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 65,\n            \"absolute_url\": \"/posts/detail/count-sum-of-numbers-in-a-list/\",\n            \"created_at\": \"2020-10-10T10:42:40.348694\",\n            \"updated_at\": \"2020-10-10T10:42:40.354236\",\n            \"title\": \"Count sum of numbers in a list\",\n            \"slug\": \"count-sum-of-numbers-in-a-list\",\n            \"description\": \"Count sum of numbers in a list. Hello there, this afternoon i wanna show you how to count sum of numbers in a list.\\r\\n\\r\\nThere basicly to add it. In this script, i have some numbers like a money, and adding it to big string `\\\"\\\"\\\"...\\\"\\\"\\\"`. however, making a `split()` to split some money, and then create one function to looping that numbers to count it.\\r\\n\\r\\n\\r\\n```\\r\\n>>> a = \\\"\\\"\\\"\\r\\n... 12.500\\r\\n... 11.000\\r\\n... 26.500\\r\\n... 11.500\\r\\n... 13.000\\r\\n... 13.500\\r\\n... 11.500\\r\\n... \\\"\\\"\\\"\\r\\n>>> def sum_list(list):\\r\\n...     tmp = 0\\r\\n...     for i in list:\\r\\n...       tmp = tmp + int(i)\\r\\n...     return tmp\\r\\n... \\r\\n>>> b = a.replace(\\\".\\\",\\\"\\\").split(\\\"n\\\")[1:-1]\\r\\n>>> sum_list(b)\\r\\n99500\\r\\n>>>\\r\\n```\",\n            \"keywords\": \"Count sum of numbers in a list, sum of numbers in a list, sum of numbers in a list python, sum number in list python\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"beginner\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 64,\n            \"absolute_url\": \"/posts/detail/simple-python-search-engine-google/\",\n            \"created_at\": \"2020-10-10T10:42:40.334019\",\n            \"updated_at\": \"2020-10-10T10:42:40.343351\",\n            \"title\": \"Simple Python search engine Google\",\n            \"slug\": \"simple-python-search-engine-google\",\n            \"description\": \"Simple Python search engine Google. Bismillahirrahmanirrahim, malam hari ini kita akan sharing sedikit script simple search engine google dengan memanfaatkan module `mechanize` dan `BeautifulSoup` di python.\\r\\n\\r\\nAdapun yang dihasilkanpun juga tidak terlalu kompleks, yaitu hanya _**link**_ dan _**title**_ saja, di inisialisasi pada page one saja, yakni tidak termasuk ke page 2 dan seterusnya.\\r\\n\\r\\n\\r\\n```\\r\\nimport time\\r\\nimport mechanize\\r\\nfrom bs4 import BeautifulSoup\\r\\n\\r\\nprint \\\"\\\"\\\"\\r\\n  Welcome to Python search engine Google\\r\\n  Simple Application to get result search from { query }\\r\\n  Design by: Summon Agus - github.com/agusmakmun\\r\\n  Thanks to: cyroxx - http://stackoverflow.com/a/16020863\\r\\n\\\"\\\"\\\"\\r\\nquery = raw_input(\\\"[+] Type your query: \\\")\\r\\n\\r\\n#prepare mechanize\\r\\nbr = mechanize.Browser()\\r\\nbr.set_handle_robots(False)\\r\\nbr.set_handle_equiv(False)\\r\\nbr.addheaders = [('User-agent', 'Mozilla/5.0')] \\r\\nbr.open('http://www.google.com/')\\r\\n\\r\\n# do the query\\r\\nbr.select_form(name='f')   # Note: select the form named 'f' here\\r\\nbr.form['q'] = query\\r\\ndata = br.submit()\\r\\nsoup = BeautifulSoup(data.read())\\r\\n\\r\\nprint \\\"[+] Result query of %s ...n\\\" % query\\r\\ncount = 0\\r\\nnumb  = 0\\r\\nfor post in soup.select('li.g'):\\r\\n    count += 1\\r\\n    numb  += 1\\r\\n    get_link     = post.find('a', href=True)\\r\\n    href         = get_link['href']\\r\\n    link_result  = href[7:].split(\\\"&sa\\\")[0]\\r\\n\\r\\n    get_title    = str(get_link).split('\\\">')[1]    \\r\\n    get_remove   = get_title.replace('<b>','').replace('</b>','').replace('</a>','')\\r\\n                   .replace('&amp;', '&').replace('...','')\\r\\n    title_result = get_remove\\r\\n    time.sleep(1)\\r\\n    \\r\\n    if link_result[0:3] == '?q=':\\r\\n        count -= 1\\r\\n        numb -= 1\\r\\n    else:\\r\\n        print [ numb ], title_result\\r\\n        print [ count ], link_result\\r\\n        print \\\"---------------------------\\\"\\r\\n```\\r\\n\\r\\n\\r\\nSelengkapnya bisa langsung dilihat di [https://github.com/agusmakmun/Some-Examples-of-Simple-Python-Script/blob/master/grabbing/google_search.py](https://github.com/agusmakmun/Some-Examples-of-Simple-Python-Script/blob/master/grabbing/google_search.py)\",\n            \"keywords\": \"Simple Python search engine Google, simple search engine, search engine google, google on terminal, python search engine, python google search, search engine on terminal\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        }\n    ]\n}"},{"id":"394db012-a2f5-41b7-9c52-d6daf40212e4","name":"Success","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 09:18:43 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"53069"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 100,\n    \"page_size\": 20,\n    \"current_page\": 1,\n    \"next\": \"http://127.0.0.1:8000/api/v1/post/?page=2\",\n    \"previous\": null,\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 100,\n            \"absolute_url\": \"/posts/detail/how-to-custom-select-language-icon-in-django-administration/\",\n            \"created_at\": \"2020-10-10T10:42:40.853341\",\n            \"updated_at\": \"2020-10-10T10:42:40.860180\",\n            \"title\": \"How to custom select language icon in django administration\",\n            \"slug\": \"how-to-custom-select-language-icon-in-django-administration\",\n            \"description\": \"![change-language.png](https://i.imgur.com/qIhI550.png) \\r\\n\\r\\n\\r\\n\\r\\n**1. Add the base_site file inside `templates/admin/base_site.html`.**\\r\\n\\r\\n```html\\r\\n{% extends \\\"admin/base.html\\\" %}\\r\\n{% load static i18n %}\\r\\n\\r\\n{% block title %}{{ title }} | {{ site_title|default:_('Situs django admin') }}{% endblock %}\\r\\n\\r\\n{% block branding %}\\r\\n<h1 id=\\\"site-name\\\"><a href=\\\"{% url 'admin:index' %}\\\">{{ site_header|default:_('Administrasi django') }}</a></h1>\\r\\n{% endblock %}\\r\\n\\r\\n{% block nav-global %}{% endblock %}\\r\\n\\r\\n{% block welcome-msg %}\\r\\n\\r\\n  {# CUSTOM LANGUAGE ICONS #}\\r\\n  {% get_current_language as LANGUAGE_CODE %}\\r\\n  {% get_available_languages as LANGUAGES %}\\r\\n  {% get_language_info_list for LANGUAGES as languages %}\\r\\n  <span id=\\\"language-icons\\\" style=\\\"margin: -1px 0 0 -65px; position: absolute;\\\">\\r\\n    {% for language in languages %}\\r\\n      {% if language.code == 'id' %}\\r\\n        <a href=\\\"?lang=id\\\" style=\\\"margin-right: 3px;border-bottom:none\\\" title=\\\"Indonesia\\\">\\r\\n          <img height=\\\"15px\\\" src=\\\"{% static 'icons/flags/id.svg' %}\\\">\\r\\n        </a>\\r\\n      {% elif language.code == 'en' %}\\r\\n        <a href=\\\"?lang=en\\\" style=\\\"margin-right: 3px;border-bottom:none\\\" title=\\\"English\\\">\\r\\n          <img height=\\\"15px\\\" src=\\\"{% static 'icons/flags/us.svg' %}\\\">\\r\\n        </a>\\r\\n      {% endif %}\\r\\n    {% endfor %}\\r\\n  </span>\\r\\n\\r\\n  {# DFEAULT WELCOME MESSAGE GOES HERE #}\\r\\n  {{ block.super }}\\r\\n\\r\\n{% endblock %}\\r\\n```\\r\\n\\r\\n\\r\\n**2. Custom language middleware, in your file `middleware.py`**\\r\\n\\r\\n```\\r\\nfrom django.conf import settings\\r\\nfrom django.utils import translation\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\n\\r\\nclass LanguageMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def process_request(self, request):\\r\\n        \\\"\\\"\\\"\\r\\n        function to activate the translation\\r\\n        \\\"\\\"\\\"\\r\\n        if 'lang' in request.GET:\\r\\n            language = request.GET.get('lang', 'id')\\r\\n            if language in dict(settings.LANGUAGES).keys():\\r\\n                request.session['_language'] = language\\r\\n\\r\\n        language = request.session.get('_language', 'id')\\r\\n        translation.activate(language)\\r\\n```\\r\\n\\r\\n\\r\\n**3. And then in your `settings.py`**\\r\\n\\r\\n```\\r\\nTEMPLATES = [\\r\\n    {\\r\\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\\r\\n        'DIRS': [os.path.join(BASE_DIR, 'templates')],\\r\\n        'APP_DIRS': True,\\r\\n        'OPTIONS': {\\r\\n            'context_processors': [\\r\\n                'django.template.context_processors.debug',\\r\\n                'django.template.context_processors.request',\\r\\n                'django.contrib.auth.context_processors.auth',\\r\\n                'django.contrib.messages.context_processors.messages',\\r\\n            ],\\r\\n        },\\r\\n    },\\r\\n]\\r\\n\\r\\n\\r\\nMIDDLEWARE = [\\r\\n    'django.middleware.security.SecurityMiddleware',\\r\\n    'django.contrib.sessions.middleware.SessionMiddleware',\\r\\n    'django.middleware.common.CommonMiddleware',\\r\\n    'django.middleware.csrf.CsrfViewMiddleware',\\r\\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\\r\\n    'django.contrib.messages.middleware.MessageMiddleware',\\r\\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\\r\\n    'django.middleware.locale.LocaleMiddleware',\\r\\n\\r\\n    # custom middleware\\r\\n    'yourproject.middleware.LanguageMiddleware',\\r\\n]\\r\\n\\r\\n\\r\\n# Internationalization\\r\\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\\r\\nLANGUAGES = (\\r\\n    ('id', 'Indonesia'),\\r\\n    ('en', 'English')\\r\\n)\\r\\nLOCALE_PATHS = (\\r\\n    os.path.join(BASE_DIR, 'locale'),\\r\\n)\\r\\nDEFAULT_LANGUAGE = 1\\r\\nLANGUAGE_CODE = 'id'\\r\\nUSE_I18N = True\\r\\nUSE_L10N = True\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 24,\n                    \"name\": \"internationalization\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 19,\n                    \"name\": \"templates\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 99,\n            \"absolute_url\": \"/posts/detail/how-to-setup-all-raw_id_fields-and-search_fields-for-django/\",\n            \"created_at\": \"2020-10-10T10:42:40.840191\",\n            \"updated_at\": \"2020-10-10T10:42:40.848773\",\n            \"title\": \"How to setup all raw_id_fields and search_fields for django\",\n            \"slug\": \"how-to-setup-all-raw_id_fields-and-search_fields-for-django\",\n            \"description\": \"For example I have this 3 fields as `question_set`, `question` and `folder`.\\r\\nI need to assign all of this fields into `raw_id_fields` inside the `admin.ModelAdmin` without add manually per-single fields.\\r\\n\\r\\nthe basic way to enable raw id fields inside the `admin.ModelAdmin` look like this;\\r\\n\\r\\n\\r\\n```python\\r\\n@admin.register(QuestionList, site=admin_site)\\r\\nclass QuestionListAdmin(admin.ModelAdmin):\\r\\n    raw_id_fields = ('question_set', 'question', 'folder')    # manually\\r\\n```\\r\\n\\r\\nBut, can I setup all that `OneToOneField` and `ForeignKey` fields automatically into `raw_id_fields` without add it manually?\\r\\nsuch as applying the class mixin? sure can, to do it you can inspect the model,\\r\\nand search through the fields for instances of `ForeignKey`,\\r\\nand add the name to the tuple, for example with:\\r\\n\\r\\n\\r\\n```python\\r\\nclass DefaultAdminMixin:\\r\\n    \\\"\\\"\\\"\\r\\n    class mixin to setup default `raw_id_fields` and `search_fields`.\\r\\n    \\\"\\\"\\\"\\r\\n    raw_id_fields = ()\\r\\n    search_fields = ()\\r\\n\\r\\n    def __init__(self, model, admin_site, *args, **kwargs):\\r\\n        self.raw_id_fields = self.setup_raw_id_fields(model)\\r\\n        self.search_fields = self.setup_search_fields(model)\\r\\n        super().__init__(model, admin_site, *args, **kwargs)\\r\\n\\r\\n    def setup_raw_id_fields(self, model):\\r\\n        return tuple(\\r\\n            f.name\\r\\n            for f in model._meta.get_fields()\\r\\n            if isinstance(f, ForeignKey) or isinstance(f, OneToOneField)\\r\\n        )\\r\\n\\r\\n    def setup_search_fields(self, model):\\r\\n        return tuple(\\r\\n            f.name\\r\\n            for f in model._meta.get_fields()\\r\\n            if isinstance(f, CharField) or isinstance(f, TextField)\\r\\n        )\\r\\n```\\r\\n\\r\\n\\r\\nA `OneToOneField` is a subclass of a `ForeignKey`, so there is no need to make search for a `OneToOneField`.\\r\\nand to implement it, you can follow this below example;\\r\\n\\r\\n\\r\\n```python\\r\\n@admin.register(QuestionList, site=admin_site)\\r\\nclass QuestionListAdmin(DefaultAdminMixin, admin.ModelAdmin):\\r\\n    pass\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 98,\n            \"absolute_url\": \"/posts/detail/awesome-django-books-by-agiliqcom/\",\n            \"created_at\": \"2020-10-10T10:42:40.822800\",\n            \"updated_at\": \"2020-10-10T10:42:40.833855\",\n            \"title\": \"Awesome django books by agiliq.com\",\n            \"slug\": \"awesome-django-books-by-agiliqcom\",\n            \"description\": \"This awesome django books for refference is also open sourced at https://github.com/agiliq/books\\r\\n\\r\\n- Django Admin Cookbook (Django 2.0)\\r\\n- Django ORM Cookbook (Django 2.0)\\r\\n- Building APIs with Django and Django Rest Framework (Django 2.0)\\r\\n- Building Multi Tenant Applications with Django (Django 2.0)\\r\\n- Journeyman Python (Python 3.6)\\r\\n- Essential Python Tools (Python 3.6)\\r\\n- Tweetable Python (Python 3.6)\\r\\n- Django Projects Cookbook (Django 2.0)\\r\\n- Django Design Patterns (Outdated)\\r\\n- Software consulting Howto (2011)\\r\\n- Visual Arts with Python (Python 3.6)\\r\\n- Django Gotchas (Outdated)\\r\\n\\r\\n![books by agiliq.com](https://i.imgur.com/Gy7cGCO.png)\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 41,\n                    \"name\": \"refferences\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"django-rest-framework\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 33,\n                    \"name\": \"django-orm\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 97,\n            \"absolute_url\": \"/posts/detail/how-to-automaticly-backup-your-projects-into-external-hardisk-in-ubuntu/\",\n            \"created_at\": \"2020-10-10T10:42:40.807953\",\n            \"updated_at\": \"2020-10-10T10:42:40.817468\",\n            \"title\": \"How to automaticly backup your projects into external hardisk in ubuntu?\",\n            \"slug\": \"how-to-automaticly-backup-your-projects-into-external-hardisk-in-ubuntu\",\n            \"description\": \"Rsync, which stands for \\\"remote sync\\\", is a remote and local file synchronization tool. It uses an algorithm that minimizes the amount of data copied by only moving the portions of files that have changed. So, you can use `rsync` to handle this case.\\r\\n\\r\\nRsync is a very flexible network-enabled syncing tool. It can also refer to the network protocol developed to utilize this tool. When we reference rsync in this guide, we are mainly referring to the utility, and not the protocol. \\r\\n\\r\\nDue to its ubiquity on Linux and Unix-like systems and its popularity as a tool for system scripts, it is included on most Linux distributions by default.\\r\\n\\r\\nFor example:\\r\\n\\r\\n```bash\\r\\nrsync -a --exclude \\\"*.pyc\\\" /path/to/origin-directory/* /path/to/destination/\\r\\n```\\r\\n\\r\\nAnd then, add your command into bash file:\\r\\n\\r\\n\\r\\n```bash\\r\\n#!/bin/bash\\r\\n\\r\\nORIGIN=\\\"/home/yourusername/projects/*\\\"\\r\\nDESTINATION=\\\"/media/yourusername/Elements/jobs/projects/\\\"\\r\\n\\r\\nif [ -d $DESTINATION ]; then\\r\\n    rsync -a --exclude \\\"*.pyc\\\" $ORIGIN $DESTINATION;\\r\\n    echo \\\"Updated at:\\\" $(date);\\r\\nelse\\r\\n    echo \\\"Path $DESTINATION not found.\\\";\\r\\n    echo \\\"Not updated at:\\\" $(date);\\r\\nfi\\r\\n```\\r\\n\\r\\nChange mode for your bash file:\\r\\n\\r\\n```\\r\\n$ chmod +x autosync.sh\\r\\n```\\r\\n\\r\\nDon't miss to add into cronjobs\\r\\n\\r\\n```\\r\\n$ crontab -e\\r\\n```\\r\\n\\r\\nthen, in your editor:\\r\\n\\r\\n\\r\\n```\\r\\n# Select shell mode\\r\\nSHELL=/bin/bash\\r\\n\\r\\n\\r\\n# sync the folders for every hours, for more: https://crontab.guru/every-1-hour\\r\\n0 * * * * /home/yourusername/tools/autosync.sh > /yourusername/tools/autosync.log 2>&1\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 40,\n                    \"name\": \"ubuntu\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 5,\n                    \"name\": \"directory\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 96,\n            \"absolute_url\": \"/posts/detail/how-to-create-django-language-middleware/\",\n            \"created_at\": \"2020-10-10T10:42:40.794969\",\n            \"updated_at\": \"2020-10-10T10:42:40.803118\",\n            \"title\": \"How to create Django Language Middleware\",\n            \"slug\": \"how-to-create-django-language-middleware\",\n            \"description\": \"This example below to setup default language code as `id` (Indonesian).\\r\\n\\r\\n\\r\\n1. Your file `middleware.py`\\r\\n\\r\\n\\r\\n```python\\r\\n# -*- coding: utf-8 -*-\\r\\n\\r\\nfrom django.conf import settings\\r\\nfrom django.utils import translation\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\n\\r\\nclass LanguageMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def process_request(self, request):\\r\\n        \\\"\\\"\\\"\\r\\n        function to activate the translation\\r\\n        \\\"\\\"\\\"\\r\\n        if 'lang' in request.GET:\\r\\n            language = request.GET.get('lang', 'id')\\r\\n            if language in dict(settings.LANGUAGES).keys():\\r\\n                request.session['_language'] = language\\r\\n\\r\\n        language = request.session.get('_language', 'id')\\r\\n        translation.activate(language)\\r\\n```\\r\\n\\r\\n\\r\\n2. And then in your `settings.py`\\r\\n\\r\\n\\r\\n```python\\r\\nMIDDLEWARE = [\\r\\n    'django.middleware.security.SecurityMiddleware',\\r\\n    'django.contrib.sessions.middleware.SessionMiddleware',\\r\\n    'django.middleware.common.CommonMiddleware',\\r\\n    'django.middleware.csrf.CsrfViewMiddleware',\\r\\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\\r\\n    'django.contrib.messages.middleware.MessageMiddleware',\\r\\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\\r\\n    'django.middleware.locale.LocaleMiddleware',\\r\\n\\r\\n    # custom middleware\\r\\n    'yourproject.middleware.LanguageMiddleware',\\r\\n]\\r\\n\\r\\n\\r\\n# Internationalization\\r\\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\\r\\nLANGUAGES = (\\r\\n    ('id', 'Indonesia'),\\r\\n    ('en', 'English')\\r\\n)\\r\\nLOCALE_PATHS = (\\r\\n    os.path.join(BASE_DIR, 'locale'),\\r\\n)\\r\\nDEFAULT_LANGUAGE = 1\\r\\nLANGUAGE_CODE = 'id'\\r\\nUSE_I18N = True\\r\\nUSE_L10N = True\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 24,\n                    \"name\": \"internationalization\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 16,\n                    \"name\": \"settings\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 95,\n            \"absolute_url\": \"/posts/detail/how-to-make-a-notification-when-terminal-process-is-complete/\",\n            \"created_at\": \"2020-10-10T10:42:40.781333\",\n            \"updated_at\": \"2020-10-10T10:42:40.787489\",\n            \"title\": \"How to make a notification when terminal process is complete\",\n            \"slug\": \"how-to-make-a-notification-when-terminal-process-is-complete\",\n            \"description\": \"I have started a long process through a terminal. Is it possible to make the Ubuntu terminal make a sound once the process is complete? This way, I don’t need to keep checking, but will instead be notified through a sound or another notification.\\r\\n\\r\\nYou can use this some alternatives;\\r\\n\\r\\n\\r\\n```bash\\r\\n$ your-bash-command && aplay /path/to/sound.wav  # can also with *.ogg file.\\r\\n```\\r\\n\\r\\n```bash\\r\\n$ your-bash-command && paplay /path/to/sound.ogg  # can also with *.wav file.\\r\\n```\\r\\n\\r\\n```bash\\r\\n$ your-bash-command; spd-say \\\"done\\\"\\r\\n```\\r\\n\\r\\n```bash\\r\\n$ your-bash-command && notify-send \\\"done\\\"  # without sound\\r\\n$ your-bash-command && notify-send \\\"Process completed\\\" \\\"Come back to the terminal, the task is over\\\"\\r\\n```\\r\\n\\r\\n------------\\r\\n\\r\\nAnd this script below is modification of that commands above.\\r\\n\\r\\n1. Create the `notif-me.sh` file;\\r\\n\\r\\n```bash\\r\\n#!/bin/bash\\r\\n\\r\\nnotify-send \\\"Process completed\\\" \\\"Come back to the terminal, the task is over\\\"\\r\\nspd-say \\\"My lord, your process hasbeen complete.\\\"\\r\\n```\\r\\n\\r\\n2. Make it callable in `/bin`\\r\\n\\r\\n```bash\\r\\nsudo cp notif-me.sh /bin/notif-me;\\r\\n```\\r\\n\\r\\n3. Use it;\\r\\n\\r\\n```bash\\r\\n$ your-bash-command; notif-me\\r\\n\\r\\n# or \\r\\n\\r\\n$ your-bash-command && notif-me\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 94,\n            \"absolute_url\": \"/posts/detail/django-standard-api-response-middleware-for-drf/\",\n            \"created_at\": \"2020-10-10T10:42:40.768715\",\n            \"updated_at\": \"2020-10-10T10:42:40.775974\",\n            \"title\": \"Django Standard API Response Middleware for DRF\",\n            \"slug\": \"django-standard-api-response-middleware-for-drf\",\n            \"description\": \"As you can see, if you using django-rest-framework, you will found many different response format. This middleware to solve all of these problems with implement the Standard API Response.\\r\\n\\r\\nAll HTTP Response status stored into json response, not in HTTP Status (because mobile application, like android can't fetch the response body when HTTP Status >= 400).\\r\\n\\r\\n\\r\\n### `middleware.py`\\r\\n\\r\\n\\r\\n```python\\r\\nimport json\\r\\nimport copy\\r\\n\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\nfrom django.core.serializers.json import DjangoJSONEncoder\\r\\n\\r\\nfrom rest_framework import status\\r\\n\\r\\n\\r\\nclass BaseAPIResponseMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def render_response(self, response):\\r\\n        \\\"\\\"\\\"\\r\\n        function to fixed the response API following with this format:\\r\\n\\r\\n        [1] success single\\r\\n            {\\r\\n             \\\"status\\\": 200,\\r\\n             \\\"success\\\": true,\\r\\n             \\\"message\\\": \\\"The success message\\\",\\r\\n             \\\"result\\\": {}\\r\\n            }\\r\\n\\r\\n        [2] success list\\r\\n            {\\r\\n               \\\"status\\\": 200,\\r\\n               \\\"success\\\": true,\\r\\n               \\\"message\\\": null,\\r\\n               \\\"results\\\": [],\\r\\n\\r\\n               \\\"count\\\": 2,\\r\\n               \\\"page_size\\\": 5,\\r\\n               \\\"current_page\\\": 1,\\r\\n               \\\"next\\\": \\\"{{url}}/api/page/?page=2&search=a\\\",\\r\\n               \\\"previous\\\": null\\r\\n            }\\r\\n\\r\\n        [3] failed\\r\\n            {\\r\\n               \\\"status\\\": 400,\\r\\n               \\\"success\\\": false,\\r\\n               \\\"message\\\": \\\"The failed message\\\",\\r\\n               \\\"result\\\": {}\\r\\n            }\\r\\n        \\\"\\\"\\\"\\r\\n        default_response_keys = ('status', 'status_http', 'detail', 'message',\\r\\n                                 'success', 'non_field_errors', 'count',\\r\\n                                 'page_size', 'current_page', 'next',\\r\\n                                 'previous', 'result', 'results')\\r\\n        response_data = copy.deepcopy(response.data)\\r\\n\\r\\n        # setup default result if doesn't exist\\r\\n        if not any(['result' in response_data, 'results' in response_data]):\\r\\n            response_data.update({'result': {}})\\r\\n\\r\\n        # setup default message into response data\\r\\n        if 'message' not in response_data:\\r\\n            response_data.update({'message': None})\\r\\n\\r\\n        # store the status_code into response data\\r\\n        if 'status' not in response_data:\\r\\n            response_data.update({'status': response.status_code})\\r\\n\\r\\n        # store the status_http into response data\\r\\n        if 'status_http' not in response_data:\\r\\n            response_data.update({'status_http': response.status_code})\\r\\n\\r\\n        # updating the response message\\r\\n        if 'detail' in response_data:\\r\\n            response_data.update({'message': response_data.get('detail')})\\r\\n            del response_data['detail']\\r\\n\\r\\n        elif 'non_field_errors' in response_data:\\r\\n            response_errors = '<br />'.join(response_data.get('non_field_errors'))\\r\\n            response_data.update({'message': response_errors})\\r\\n            del response_data['non_field_errors']\\r\\n\\r\\n        # store the success boolean into response data\\r\\n        if response.status_code >= 400:\\r\\n            response_errors = []\\r\\n            response_errors_keys = []\\r\\n\\r\\n            for (key, value) in response_data.items():\\r\\n                if key not in default_response_keys:\\r\\n                    errors = ' '.join([str(v) for v in value])\\r\\n                    errors = '%s: %s' % (key, errors)\\r\\n                    response_errors.append(errors)\\r\\n                    response_errors_keys.append(key)\\r\\n\\r\\n            if len(response_errors) > 0:\\r\\n                response_errors = '<br />'.join(response_errors)\\r\\n                response_data.update({'message': response_errors})\\r\\n\\r\\n            # deleting the errors in the field keys.\\r\\n            if len(response_errors_keys) > 0:\\r\\n                list(map(response_data.pop, response_errors_keys))\\r\\n\\r\\n            if not response_data.get('message'):\\r\\n                response_data.update({'message': _('Failed')})\\r\\n\\r\\n            response_data.update({'success': False,\\r\\n                                  'status_http': status.HTTP_200_OK})\\r\\n\\r\\n        elif response.status_code >= 100:\\r\\n            if not response_data.get('message'):\\r\\n                response_data.update({'message': _('Success')})\\r\\n\\r\\n            if 'success' not in response_data:\\r\\n                response_data.update({'success': True})\\r\\n\\r\\n        return response_data\\r\\n\\r\\n    def process_response(self, request, response):\\r\\n        if hasattr(response, 'data') and isinstance(response.data, dict):\\r\\n            try:\\r\\n                response_data = self.render_response(response)\\r\\n                response.status_code = response_data.get('status_http')\\r\\n\\r\\n                if 'status_http' in response_data:\\r\\n                    del response_data['status_http']\\r\\n\\r\\n                response.data = response_data\\r\\n                response.content = json.dumps(response_data, cls=DjangoJSONEncoder)\\r\\n            except Exception:\\r\\n                pass\\r\\n\\r\\n        # handle error response but without `response.data`\\r\\n        # this error response specific for \\\"Server Error\\\" mode.\\r\\n        response_format = request.headers.get('Response-Format')\\r\\n        if (response.status_code >= 500) and (response_format == 'application/json'):\\r\\n            response_data = {'success': False, 'result': {},\\r\\n                             'status': response.status_code,\\r\\n                             'message': response.reason_phrase}\\r\\n            response.status_code = 200\\r\\n            response.data = response_data\\r\\n            response.content = json.dumps(response_data, cls=DjangoJSONEncoder)\\r\\n            response['Content-Type'] = 'application/json'\\r\\n\\r\\n        return response\\r\\n```\\r\\n\\r\\n\\r\\n### `paginator.py`\\r\\n\\r\\n\\r\\n```python\\r\\nfrom __future__ import unicode_literals\\r\\n\\r\\nfrom collections import OrderedDict\\r\\n\\r\\nfrom django.conf import settings\\r\\nfrom django.core.paginator import (Paginator, EmptyPage, PageNotAnInteger)\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\nfrom rest_framework import status\\r\\nfrom rest_framework.response import Response\\r\\nfrom rest_framework.pagination import (PageNumberPagination, LimitOffsetPagination)\\r\\n\\r\\n\\r\\nclass RestPagination(PageNumberPagination, LimitOffsetPagination):\\r\\n    \\\"\\\"\\\"\\r\\n    class FoobarPagiantion(RestPagination):\\r\\n        page_size = 10\\r\\n\\r\\n\\r\\n    class FoobarView(ListAPIView):\\r\\n        pagination_class = FoobarPagiantion\\r\\n    \\\"\\\"\\\"\\r\\n\\r\\n    def paginate_queryset(self, queryset, request, view=None):\\r\\n        limit = request.query_params.get('limit')\\r\\n        if str(limit).isdigit():\\r\\n            self.page_size = int(limit)\\r\\n        return super().paginate_queryset(queryset, request, view=view)\\r\\n\\r\\n    def get_paginated_response(self, results):\\r\\n        next_link = self.get_next_link() if self.get_next_link() is not None else ''\\r\\n        prev_link = self.get_previous_link() if self.get_previous_link() is not None else ''\\r\\n\\r\\n        if settings.USE_SSL:\\r\\n            next_link = next_link.replace('http:', 'https:')\\r\\n            prev_link = prev_link.replace('http:', 'https:')\\r\\n\\r\\n        return Response(OrderedDict([\\r\\n            ('count', self.page.paginator.count),\\r\\n            ('page_size', self.page_size),\\r\\n            ('current_page', self.page.number),\\r\\n            ('next', next_link if next_link != '' else None),\\r\\n            ('previous', prev_link if prev_link != '' else None),\\r\\n            ('status', status.HTTP_200_OK),\\r\\n            ('message', _('Success')),\\r\\n            ('success', True),\\r\\n            ('results', results)\\r\\n        ]))\\r\\n```\\r\\n\\r\\n\\r\\nFinally, don't miss to add your middleware into `settings.py`\\r\\n\\r\\n\\r\\n```python\\r\\nMIDDLEWARE = [\\r\\n    ....\\r\\n\\r\\n    'path.to.middleware.BaseAPIResponseMiddleware'\\r\\n]\\r\\n\\r\\n\\r\\nREST_FRAMEWORK = {\\r\\n    ....\\r\\n\\r\\n    'DEFAULT_PAGINATION_CLASS': 'path.to.paginator.RestPagination'\\r\\n}\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 38,\n                    \"name\": \"django-rest-framework\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 93,\n            \"absolute_url\": \"/posts/detail/idgenerator/\",\n            \"created_at\": \"2020-10-10T10:42:40.755260\",\n            \"updated_at\": \"2020-10-10T10:42:40.762949\",\n            \"title\": \"IDGenerator\",\n            \"slug\": \"idgenerator\",\n            \"description\": \"Generate a unique identifier of a specified fixed length consisting of the characters 0-9 and a-z. For example:\\r\\n```\\r\\nzcgst5od\\r\\n9x2zgn0l\\r\\nqa44sp0z\\r\\n61vv1nl5\\r\\numpprkbt\\r\\nylg4lmcy\\r\\ndec0lu1t\\r\\n38mhd8i5\\r\\nrx00yf0e\\r\\nkc2qdc07\\r\\n```\\r\\n\\r\\nHere is the solution:\\r\\n\\r\\n```python\\r\\nimport random\\r\\n\\r\\nclass IDGenerator(object):\\r\\n    ALPHABET = \\\"0123456789abcdefghijklmnopqrstuvwxyz\\\"\\r\\n\\r\\n    def __init__(self, length=8):\\r\\n        self._alphabet_length = len(self.ALPHABET)\\r\\n        self._id_length = length\\r\\n\\r\\n    def _encode_int(self, n):\\r\\n        # Adapted from:\\r\\n        #   Source: http://stackoverflow.com/a/561809/1497596\\r\\n        #   Author: http://stackoverflow.com/users/50902/kmkaplan\\r\\n\\r\\n        encoded = ''\\r\\n        while n > 0:\\r\\n            n, r = divmod(n, self._alphabet_length)\\r\\n            encoded = self.ALPHABET[r] + encoded\\r\\n        return encoded\\r\\n\\r\\n    def generate_id(self):\\r\\n        \\\"\\\"\\\"Generate an ID without leading zeros.\\r\\n        For example, for an ID that is eight characters in length, the\\r\\n        returned values will range from '10000000' to 'zzzzzzzz'.\\r\\n        \\\"\\\"\\\"\\r\\n\\r\\n        start = self._alphabet_length**(self._id_length - 1)\\r\\n        end = self._alphabet_length**self._id_length - 1\\r\\n        return self._encode_int(random.randint(start, end))\\r\\n\\r\\nif __name__ == \\\"__main__\\\":\\r\\n    # Sample usage: Generate ten IDs each eight characters in length.\\r\\n    idgen = IDGenerator(8)\\r\\n\\r\\n    for i in range(10):\\r\\n        print idgen.generate_id()\\r\\n```\\r\\n\\r\\nSource: http://stackoverflow.com/a/28075828/3445802\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 92,\n            \"absolute_url\": \"/posts/detail/move-multiple-files-using-bash/\",\n            \"created_at\": \"2020-10-10T10:42:40.742078\",\n            \"updated_at\": \"2020-10-10T10:42:40.749689\",\n            \"title\": \"move multiple files using bash\",\n            \"slug\": \"move-multiple-files-using-bash\",\n            \"description\": \"```\\r\\n# This method if the files has no extentions.\\r\\n$ for file in *; do mv \\\"$file\\\" \\\"$file.png\\\"; done\\r\\n\\r\\n# This method if the files has extentions before.\\r\\n$ for file in *.jpg; do mv \\\"$file\\\" \\\"$file.png\\\"; done\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 91,\n            \"absolute_url\": \"/posts/detail/deploy-django-at-heroku/\",\n            \"created_at\": \"2020-10-10T10:42:40.725580\",\n            \"updated_at\": \"2020-10-10T10:42:40.734258\",\n            \"title\": \"Deploy Django at Heroku\",\n            \"slug\": \"deploy-django-at-heroku\",\n            \"description\": \"**1.** Install heroku cli\\r\\n\\r\\n  https://devcenter.heroku.com/articles/heroku-cli\\r\\n\\r\\n**2.** Add `Procfile` to your project, and add this command below:\\r\\n\\r\\n```\\r\\n$ cd yourenv/yourproject/\\r\\n$ vim Procfile\\r\\n\\r\\n# then, add this command below to the file:\\r\\n\\r\\nweb: python manage.py runserver 0.0.0.0:$PORT --noreload\\r\\n```\\r\\n\\r\\n**3.** Add `runtimes.txt`\\r\\n\\r\\n  Add your python version, default is `python-2.7.13`. Docs: https://devcenter.heroku.com/articles/python-runtimes\\r\\n\\r\\n```\\r\\n$ cat runtime.txt\\r\\npython-3.5.2\\r\\n```\\r\\n\\r\\n**4.** Installing Whitenoise\\r\\n\\r\\nFirst, install WhiteNoise with pip, and add it to your requirements.txt file.\\r\\nDocs: https://devcenter.heroku.com/articles/django-assets#whitenoise\\r\\n\\r\\n```\\r\\n$ pip install whitenoise\\r\\n...\\r\\n$ pip freeze > requirements.txt\\r\\n```\\r\\n\\r\\nNext, install WhiteNoise into your Django application. This is done in `wsgi.py`.\\r\\n\\r\\n```python\\r\\nfrom django.core.wsgi import get_wsgi_application\\r\\nfrom whitenoise.django import DjangoWhiteNoise\\r\\n\\r\\napplication = get_wsgi_application()\\r\\napplication = DjangoWhiteNoise(application)\\r\\n```\\r\\n\\r\\nFinally, if you’d like gzip functionality enabled, add the following setting to `settings.py`.\\r\\n\\r\\n```\\r\\n# Simplified static file serving.\\r\\n# https://warehouse.python.org/project/whitenoise/\\r\\n\\r\\nSTATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'\\r\\n\\r\\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\\r\\n\\r\\n# Static files (CSS, JavaScript, Images)\\r\\n# https://docs.djangoproject.com/en/1.9/howto/static-files/\\r\\nSTATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')\\r\\nSTATIC_URL = '/static/'\\r\\n\\r\\n# Extra places for collectstatic to find static files.\\r\\nSTATICFILES_DIRS = (\\r\\n    os.path.join(PROJECT_ROOT, 'static'),\\r\\n)\\r\\n```\\r\\n\\r\\n**5.** Disabling Collectstatic\\r\\nSometimes, you may not want Heroku to run collectstatic on your behalf.\\r\\nYou can disable the collectstatic build step with the `DISABLE_COLLECTSTATIC` configuration:\\r\\nDocs: https://devcenter.heroku.com/articles/django-assets#disabling-collectstatic\\r\\n\\r\\n```\\r\\n$ heroku config:set DISABLE_COLLECTSTATIC=1\\r\\n```\\r\\n\\r\\n**6.** Login to heroku & Deploy\\r\\n\\r\\n```\\r\\n$ heroku login\\r\\n```\\r\\n\\r\\n**Create a new Git repository**\\r\\n\\r\\nInitialize a git repository in a new or existing directory\\r\\n\\r\\n```\\r\\n$ cd my-project/\\r\\n$ git init\\r\\n$ heroku git:remote -a your_app_name\\r\\n```\\r\\n\\r\\n**Deploy your application**\\r\\n\\r\\nCommit your code to the repository and deploy it to Heroku using Git.\\r\\n\\r\\n```\\r\\n$ git add .\\r\\n$ git commit -am \\\"make it better\\\"\\r\\n$ git push heroku master\\r\\n```\\r\\n\\r\\n**Existing Git repository**\\r\\n\\r\\nFor existing repositories, simply add the heroku remote\\r\\n\\r\\n```\\r\\n$ heroku git:remote -a your_app_name\\r\\n```\\r\\n\\r\\n**Database Migrations**\\r\\n\\r\\n```\\r\\n$ heroku run python manage.py migrate\\r\\n$ heroku run python manage.py makemigrations yourapp_name\\r\\n$ heroku run python manage.py migrate yourapp_name\\r\\n```\\r\\n\\r\\n```\\r\\n$ heroku ps\\r\\n$ heroku ps:scale web=1\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 30,\n                    \"name\": \"server\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 90,\n            \"absolute_url\": \"/posts/detail/markdown-syntax-to-resize-or-styling-the-image/\",\n            \"created_at\": \"2020-10-10T10:42:40.710025\",\n            \"updated_at\": \"2020-10-10T10:42:40.718984\",\n            \"title\": \"Markdown syntax to resize or styling the image\",\n            \"slug\": \"markdown-syntax-to-resize-or-styling-the-image\",\n            \"description\": \"This case was issued by muradaliyev88 in [django-markdown-editor](https://github.com/agusmakmun/django-markdown-editor/issues/18){target=\\\"_blank\\\"} repository. as [answered by rudolfbyker](https://stackoverflow.com/a/41169162/6396981){target=\\\"_blank\\\"} If you are writing MarkDown for PanDoc, you can do this:\\r\\n\\r\\n```\\r\\n![image-alt](drawing.jpg){height=100px}\\r\\n```\\r\\n\\r\\nor \\r\\n\\r\\n```\\r\\n![image-alt](drawing.jpg){style=\\\"border: 1px solid;height:100px\\\"}\\r\\n```\\r\\n\\r\\nresult example\\r\\n\\r\\n![martor-preview-result](https://raw.githubusercontent.com/agusmakmun/django-markdown-editor/master/__screenshot/martor-preview-result.png){style=\\\"border: 1px solid;height:100px\\\"}\\r\\n\\r\\n\\r\\n> This also work if using a-href `[link-title](https://to-link-url){target=\\\"_blank\\\"}`, eg: [link-title](https://to-link-url){target=\\\"_blank\\\"}\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 34,\n                    \"name\": \"markdown\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 19,\n                    \"name\": \"templates\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 89,\n            \"absolute_url\": \"/posts/detail/python-numberize-until-undefined-or-infinity-numbers/\",\n            \"created_at\": \"2020-10-10T10:42:40.696963\",\n            \"updated_at\": \"2020-10-10T10:42:40.703483\",\n            \"title\": \"Python numberize until undefined or infinity numbers\",\n            \"slug\": \"python-numberize-until-undefined-or-infinity-numbers\",\n            \"description\": \"Something we need to create the function to convert the number into string number, for example:\\r\\n1000 to 1.0 k, 1000000 to 1.0 m, etc.\\r\\n\\r\\n```python\\r\\ndef numberize(number):\\r\\n    scales = {\\r\\n        1000: 'k',\\r\\n        1000000: 'm',\\r\\n        1000000000: 'b',\\r\\n        1000000000000: 't',\\r\\n        1000000000000000: 'quad',\\r\\n        1000000000000000000: 'quin',\\r\\n        1000000000000000000000: 'sexti',\\r\\n        1000000000000000000000000: 'septi',\\r\\n        1000000000000000000000000000: 'octi',\\r\\n        1000000000000000000000000000000: 'noni',\\r\\n        1000000000000000000000000000000000: 'deci',\\r\\n        1000000000000000000000000000000000000: 'undeci',\\r\\n        1000000000000000000000000000000000000000: 'duodeci',\\r\\n        1000000000000000000000000000000000000000000: 'trede',\\r\\n        1000000000000000000000000000000000000000000000: 'quattu',\\r\\n        1000000000000000000000000000000000000000000000000: 'quindeci',\\r\\n        1000000000000000000000000000000000000000000000000000: 'sexdeci',\\r\\n        1000000000000000000000000000000000000000000000000000000: 'septend',\\r\\n        1000000000000000000000000000000000000000000000000000000000: 'octodeci',\\r\\n        1000000000000000000000000000000000000000000000000000000000000: 'novemdeci',\\r\\n        1000000000000000000000000000000000000000000000000000000000000000: 'vigintillion',\\r\\n        1000000000000000000000000000000000000000000000000000000000000000000: 'infinity'\\r\\n    }\\r\\n    number = int(number)\\r\\n    for digit, name in scales.items():\\r\\n        minimum = '9' * len(str(digit)[1:])\\r\\n        maximum = minimum + '999'\\r\\n\\r\\n        if number > max(scales):\\r\\n            return \\\"{0:.1f} \\\".format(number / max(scales)) + name\\r\\n\\r\\n        elif number > int(minimum) and number <= int(maximum):\\r\\n            return \\\"{0:.1f} \\\".format(number / digit) + name\\r\\n    return number\\r\\n```\\r\\n\\r\\nFor example\\r\\n\\r\\n\\r\\n```python\\r\\n>>> numberize(1000)\\r\\n1.0 k\\r\\n>>> numberize(1000000)\\r\\n1.0 m\\r\\n>>> numberize(100120009319931)\\r\\n100.1 t\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"looping\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"beginner\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 88,\n            \"absolute_url\": \"/posts/detail/upload-to-pypi-using-twine/\",\n            \"created_at\": \"2020-10-10T10:42:40.683444\",\n            \"updated_at\": \"2020-10-10T10:42:40.689803\",\n            \"title\": \"Upload to PyPi using twine\",\n            \"slug\": \"upload-to-pypi-using-twine\",\n            \"description\": \"[The Python Package Index (PyPI)](https://pypi.org) is a repository of software for the Python programming language. PyPI helps you find and install software developed and shared by the Python community.\\r\\n\\r\\n### 1. Install `twine`\\r\\n\\r\\n```\\r\\npip install twine\\r\\n```\\r\\n\\r\\n### 2. Create a dist file\\r\\n\\r\\n```\\r\\npython setup.py sdist\\r\\n```\\r\\n\\r\\n### 3. Upload using twine\\r\\n\\r\\n```\\r\\ntwine upload dist/*\\r\\n```\",\n            \"keywords\": \"pypi, twine\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 20,\n                    \"name\": \"news\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 12,\n                    \"name\": \"app\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 87,\n            \"absolute_url\": \"/posts/detail/difflib-similarity/\",\n            \"created_at\": \"2020-10-10T10:42:40.666839\",\n            \"updated_at\": \"2020-10-10T10:42:40.676583\",\n            \"title\": \"difflib similarity\",\n            \"slug\": \"difflib-similarity\",\n            \"description\": \"This module provides classes and functions for comparing sequences. It can be used for example, for comparing files, and can produce difference information in various formats, including HTML and context and unified diffs.\\r\\n\\r\\nReturn a list of the best \\\"good enough\\\" matches.\\r\\nword is a sequence for which close matches are desired (typically a string),\\r\\nand possibilities is a list of sequences against which to match word (typically a list of strings).\\r\\n\\r\\n[-] difflib is very slow if you going to work with large number of docs.\\r\\n\\r\\n- difflib.SequenceMatcher uses the Ratcliff/Obershelp algorithm it computes the doubled\\r\\n    number of matching characters divided by the total number of characters in the two strings.\\r\\n\\r\\n- Levenshtein uses Levenshtein algorithm it computes the minimum number of edits needed to transform one string into the other\\r\\n\\r\\n\\r\\nComplexity:\\r\\n\\r\\n- SequenceMatcher is quadratic time for the worst case and has expected-case behavior dependent\\r\\n    in a complicated way on how many elements the sequences have in common. (from here)\\r\\n\\r\\n- Levenshtein is O(m*n), where n and m are the length of the two input strings.\\r\\n\\r\\nPerformance:\\r\\n\\r\\n- According to the source code of the Levenshtein module : Levenshtein has a some overlap with difflib (SequenceMatcher).\\r\\n    It supports only strings, not arbitrary sequence types, but on the other hand it's much faster.\\r\\n\\r\\n\\r\\n```python\\r\\nimport difflib\\r\\n\\r\\n\\r\\ndef difflib_similarity_old(words1, words2):\\r\\n    \\\"\\\"\\\"\\r\\n    return float() words similarity using `difflib.get_close_matches`\\r\\n    with 1 is higgest score for this case.\\r\\n    \\\"\\\"\\\"\\r\\n    list_words1 = words1.split()\\r\\n    list_words2 = words2.split()\\r\\n\\r\\n    score = 0\\r\\n    similarity = difflib.get_close_matches\\r\\n\\r\\n    for word in list_words1:\\r\\n        if similarity(word, list_words2):\\r\\n            score += 1\\r\\n\\r\\n    return float(score) / float(len(list_words1))\\r\\n\\r\\n\\r\\ndef difflib_similarity(words1, words2):\\r\\n    \\\"\\\"\\\"\\r\\n    return float() words ratio using `difflib.SequenceMatcher`\\r\\n    \\\"\\\"\\\"\\r\\n    return difflib.SequenceMatcher(None, words1, words2).ratio()\\r\\n\\r\\n\\r\\nif __name__ == '__main__':\\r\\n    words1 = 'saya mencoba untuk lari sekencang mungkin'\\r\\n    words2 = 'anda lari dari tiang dengan sangat kencang'\\r\\n    print(difflib_similarity(words1, words2))  # 0.5\\r\\n```\\r\\n\\r\\n\\r\\nRefference:\\r\\n    - https://docs.python.org/3/library/difflib.html\\r\\n    - https://stackoverflow.com/a/11277680/6396981\\r\\n    - https://stackoverflow.com/q/6690739/6396981\",\n            \"keywords\": \"difflib, difflib similarity\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 86,\n            \"absolute_url\": \"/posts/detail/changewords-simply-python-tool-to-change-or-replace-the-text-string-in-the-files/\",\n            \"created_at\": \"2020-10-10T10:42:40.647757\",\n            \"updated_at\": \"2020-10-10T10:42:40.655561\",\n            \"title\": \"changewords - Simply python tool to change or replace the text string in the files\",\n            \"slug\": \"changewords-simply-python-tool-to-change-or-replace-the-text-string-in-the-files\",\n            \"description\": \"**changewords** is Simply python tool to change or replace the text string in the files. This tool pretty nice for programmers if somehow they want to replace/change their codes for many files, eg: function, class, variable, etc for recursive files or not.\\r\\n\\r\\nYou can directly install this tool from PyPI:\\r\\n\\r\\n```\\r\\n$ pip install changewords\\r\\n```\\r\\n\\r\\n**usage:**\\r\\n\\r\\n```\\r\\nusage: changewords [-h] [-p PATH] [-ft FILE_TYPE] [-fs FROM_STRING]\\r\\n                   [-ts TO_STRING]\\r\\n\\r\\nPython tool to change or replace the strings in files.\\r\\n\\r\\noptional arguments:\\r\\n  -h, --help            show this help message and exit\\r\\n  -p PATH, --path PATH  the file type you are looking for. eg: '.py', '.txt'\\r\\n                        by default is current path/folder.\\r\\n  -ft FILE_TYPE, --file_type FILE_TYPE\\r\\n                        file type you are looking for, eg: '.py', '.txt'\\r\\n  -fs FROM_STRING, --from_string FROM_STRING\\r\\n                        the string to change/replace\\r\\n  -ts TO_STRING, --to_string TO_STRING\\r\\n                        the string replacement\\r\\n```\\r\\n\\r\\n**example:**\\r\\n\\r\\n\\r\\n```\\r\\n$ changewords -p=mypath -ft=.py -fs=helloworld -ts=mantabjiwa\\r\\n\\r\\n# or\\r\\n\\r\\n$ changewords --path=mypath --file_type=.py --from_string=helloworld --to_string=mantabjiwa\\r\\n```\\r\\n\\r\\nSource: https://github.com/agusmakmun/changewords\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 20,\n                    \"name\": \"news\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"looping\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 5,\n                    \"name\": \"directory\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 85,\n            \"absolute_url\": \"/posts/detail/convert-all-mp4-files-into-mp3-files/\",\n            \"created_at\": \"2020-10-10T10:42:40.631349\",\n            \"updated_at\": \"2020-10-10T10:42:40.639193\",\n            \"title\": \"Convert all mp4 files into mp3 files\",\n            \"slug\": \"convert-all-mp4-files-into-mp3-files\",\n            \"description\": \"One method is a bash `*for loop*`.\\r\\n\\r\\nEasy convert to `.mp3` files:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *.mp4; do ffmpeg -i \\\"$f\\\" \\\"outputs/${f%.mp4}.mp3\\\"; done\\r\\n```\\r\\n\\r\\n\\r\\nFor converting only `.mp4` files:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *.mp4; do ffmpeg -i \\\"$f\\\" -c:a libmp3lame \\\"outputs/${f%.mp4}.mp3\\\"; done\\r\\n```\\r\\n\\r\\n\\r\\nFor converting `.m4a`, `.mov`, and `.flac`:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *.{m4a,mov,flac}; do ffmpeg -i \\\"$f\\\" -c:a libmp3lame \\\"outputs/${f%.*}.mp3\\\"; done\\r\\n```\\r\\n\\r\\n\\r\\nFor converting anything use the \\\"*\\\" wildcard:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *; do ffmpeg -i \\\"$f\\\" -c:a libmp3lame \\\"outputs/${f%.*}.mp3\\\"; done\\r\\n```\\r\\n\\r\\nRefference: https://stackoverflow.com/a/38485017/6396981\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"looping\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 84,\n            \"absolute_url\": \"/posts/detail/martor-127-has-been-released/\",\n            \"created_at\": \"2020-10-10T10:42:40.613862\",\n            \"updated_at\": \"2020-10-10T10:42:40.621122\",\n            \"title\": \"Martor 1.2.7 has been released\",\n            \"slug\": \"martor-127-has-been-released\",\n            \"description\": \"![martor editor](https://raw.githubusercontent.com/agusmakmun/django-markdown-editor/master/__screenshot/martor-preview-editor.png)\\r\\n\\r\\nThis Martor is one of many plugin for django markdown editor. But in this case, martor still use [_Semantic UI_](https://semantic-ui.com) for the front-end.\\r\\nFor the previous version, martor included the features such as:\\r\\n\\r\\n* Live Preview\\r\\n* Integrated with Ace Editor\\r\\n* Integrated with Semantic-UI\\r\\n* Support Multiple Fields (fixed this issue)\\r\\n* Upload Image to imgur.com (via API) and custom uploader.\\r\\n* Direct Mention users @[username] - (require user to logged in)\\r\\n* Emoji :emoji_name: + Cheat sheets\\r\\n* Martor Commands Refference\\r\\n* Support Django Admin\\r\\n* Toolbar Buttons\\r\\n* Highlight pre\\r\\n\\r\\n\\r\\n**So, what's on offer in the latest version?**\\r\\n\\r\\n1. Support Django>=2.0\\r\\n2. Support embed/iframe video from (Youtube, Vimeo, Dailymotion, Yahoo, Veoh, & Metacafe)\\r\\n\\r\\n\\r\\nMartor is available directly from [PyPI](https://pypi.org/project/martor/), which following `pip` command:\\r\\n\\r\\n```\\r\\n$ pip install martor\\r\\n```\\r\\n\\r\\n> For the docs, you can checkout at the official repository: https://github.com/agusmakmun/django-markdown-editor\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 34,\n                    \"name\": \"markdown\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 83,\n            \"absolute_url\": \"/posts/detail/simple-adding-django-disqus-comments/\",\n            \"created_at\": \"2020-10-10T10:42:40.598005\",\n            \"updated_at\": \"2020-10-10T10:42:40.605916\",\n            \"title\": \"Simple Adding Django Disqus Comments\",\n            \"slug\": \"simple-adding-django-disqus-comments\",\n            \"description\": \"Simple Adding Django Disqus Comments, Disqus adalah salah satu comments plugin yang sangat populer saat ini. Selain facebook comments, google+ comments, disqus ini juga merupakan salah satu plugin favorite yang banyak digunakan para pengembang website. Selain tampilannya yang menarik, juga instalasinya yang simple dan tidak begitu rumit.\\r\\n\\r\\nDisqus Comments juga mensupport di Django, karena menurut saya pribadi Disqus Comments recomended ketika anda saat ini menggunakan Django, disamping face'nya yang lumayan baik, juga mudah dari segi instalasi.\\r\\n\\r\\nDjango disqus juga memberikan dokumentasi bagaimana cara instalasi, setting dan penggunaanya disini:[http://django-disqus.readthedocs.org/en/latest/installation.html](http://django-disqus.readthedocs.org/en/latest/installation.html \\\"Django Disqus\\\")\\r\\n\\r\\nDan pada bahasan kali ini, kita ambil contoh yang paling simple'nya.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nDalam instalasi ada beberapa cara, contohnya seperti menggunakan `pip`, `easy_install`, dan dengan cara menjalankan `setup.py` yang telah di extract.\\r\\n\\r\\n```\\r\\n$ pip install django-disqus\\r\\n```\\r\\n\\r\\n\\r\\nDan untuk setting apps dan api di `settings.py`, kurang lebih seperti ini:\\r\\n\\r\\n```\\r\\nINSTALLED_APPS = (\\r\\n     ...\\r\\n     'disqus',\\r\\n)\\r\\n\\r\\nDISQUS_API_KEY = 'FOOBARFOOBARFOOBARFOOBARFOOBARF'\\r\\nDISQUS_WEBSITE_SHORTNAME = 'foobar'\\r\\n```\\r\\n\\r\\n\\r\\nUntuk mendapatkan API disqus'nya bisa disini: [https://disqus.com/api/applications/](https://disqus.com/api/applications/ \\\"API Disqus\\\")\\r\\n\\r\\nDan untuk penempatan di template'nya seperti ini kurang lebihnya:\\r\\n\\r\\n```\\r\\n{% load disqus_tags %}\\r\\n{% set_disqus_identifier \\\"blogentry_\\\" object.title %}\\r\\n{% set_disqus_title page.title %}\\r\\n{% disqus_show_comments %}\\r\\n{% disqus_dev %}\\r\\n```\\r\\n\\r\\n\\r\\nSemoga bermanfaat.\\r\\n\\r\\nSource:\\r\\n- http://django-disqus.readthedocs.org/en/latest/installation.html\\r\\n- http://www.the-swamp.info/blog/adding-disqus-comments/\",\n            \"keywords\": \"django disqus, disqus, django, django disqus comments, disqus comments, tutorial django disqus comments\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 82,\n            \"absolute_url\": \"/posts/detail/menggunakan-graph-api-facebook-sangat-mudah-dengan-facepy/\",\n            \"created_at\": \"2020-10-10T10:42:40.585865\",\n            \"updated_at\": \"2020-10-10T10:42:40.591859\",\n            \"title\": \"Menggunakan Graph API Facebook sangat mudah dengan Facepy\",\n            \"slug\": \"menggunakan-graph-api-facebook-sangat-mudah-dengan-facepy\",\n            \"description\": \"Menggunakan Graph API Facebook sangat mudah dengan Facepy, Facepy adalah salah satu module tambahan untuk Python Programming yang dikembangkan guna memanfaatkan Graph API Facebook.\\r\\n\\r\\nTerimakasih banyak kepada `Bos Dadang`, yang memberikan referensi ini. Beberapa test yang kami lakukan contohnya seperti post ke group, dan membuat status.\\r\\n\\r\\nJika beberapa waktu lalu saya juga pernah menggunkan salah satu module tambahan untuk python, yaitu`fbcmd`, namun sayangnya beberapa tahun lalu developer `fbcmd` menyatakan R.I.P dengan repository yang dibuatnya, karena hak akses dari facebook yang diperketat.\\r\\n\\r\\nJika ingin melihat script fbcmd yang kita kembangkan, bisa lihat di github:[https://github.com/agusmakmun/Status-Facebook-Menggunakan-Python](https://github.com/agusmakmun/Status-Facebook-Menggunakan-Python \\\"Python FBCMD\\\")\\r\\n\\r\\n![Menggunakan Graph API Facebook sangat mudah dengan Facepy](https://python.web.id/media/gallery/Group_Tester.png \\\"Menggunakan Graph API Facebook sangat mudah dengan Facepy\\\")\\r\\n\\r\\nGambar diatas adalah salah satu contoh result yang dihasilkan dari module `Facepy` ini.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nUntuk instalasinya sangat mudah, pastikan anda memiliki `pip`, jika dengan manual bisa di download --> extract dan menjalankan `setup.py`'nya.\\r\\n\\r\\n\\r\\n```\\r\\n$ pip install facepy\\r\\n```\\r\\n\\r\\n\\r\\n### Penggunaan\\r\\n\\r\\nPastikan anda telah membuat app facebooknya, jika belum bisa menggunakan Graph API Explorer. dan berikut ini beberapa setting yang perlu diperhatikan.\\r\\n\\r\\n- https://www.facebook.com/settings?tab=applications&section=all   --> change to public access.\\r\\n- http://facepy.readthedocs.org/en/latest/usage/graph-api.html     --> docs graph api.\\r\\n- https://developers.facebook.com/tools/explorer/                  --> change to allow some premission.\\r\\n- https://github.com/jgorset/facepy                                --> repository.\\r\\n\\r\\nDan dibawah ini adalah penggunaan simple dari `Facepy` ini.\\r\\n\\r\\n```\\r\\nfrom facepy import GraphAPI\\r\\nACCESS_TOKEN = 'tokentokentokentoken'\\r\\nID_GROUP_OR_PAGE = '1234567890'\\r\\ngraph = GraphAPI(ACCESS_TOKEN)\\r\\n\\r\\ngraph.post(ID_GROUP_OR_PAGE+'/feed', message='Test My Status on Group/Pages')\\r\\ngraph.post('me/feed', message='Test My Status')\\r\\n```\\r\\n\\r\\n\\r\\nDjango juga di sediakan loo.. :D Untuk lebih lengkapnya bisa langsung dikunjungi repository-nya di github:[https://github.com/jgorset/facepy](https://github.com/jgorset/facepy \\\"Facepy\\\")\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"facebook, api facebook, facepy, graph api facebook, python facebook, django facebook\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 81,\n            \"absolute_url\": \"/posts/detail/sms-via-python/\",\n            \"created_at\": \"2020-10-10T10:42:40.575722\",\n            \"updated_at\": \"2020-10-10T10:42:40.581592\",\n            \"title\": \"SMS via Python\",\n            \"slug\": \"sms-via-python\",\n            \"description\": \"SMS via Python – Sms via python kali ini kita hanya memanfaatkan salah satu website yang menyediakan layanan sms gratis ini. Jika ingin membuat [SMS Gateway, bisa disini](http://bloggersmart.net/membuat-mesin-sms-gateway-dengan-raspberry-pi-kalkun-sms-gammu/ \\\"sms gateway\\\").\\r\\n\\r\\n![SMS via Python](https://python.web.id/media/gallery/sms-success-2.jpg \\\"SMS via Python\\\")\\r\\n\\r\\n```\\r\\n\\\"\\\"\\\"\\r\\nName             : Python SMS Sender\\r\\nCreated By       : Agus Makmun (Summon Agus)\\r\\nBlog             : bloggersmart.net - python.web.id\\r\\nLicense          : GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007\\r\\nDocumentation    : https://github.com/agusmakmun/Some-Examples-of-Simple-Python-Script/\\r\\n\\\"\\\"\\\"\\r\\n\\r\\nimport cookielib\\r\\nimport urllib2\\r\\nimport sys\\r\\n\\r\\nsms = raw_input('[+] Enter your SMS Message: ')\\r\\nno = raw_input('[+] Enter your number: ')\\r\\n\\r\\nprint '[+] In the process sending SMS....'\\r\\n\\r\\nurl ='http://www.smsgratis.web.id'\\r\\nbuka =  urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))\\r\\ndata= 'Phonenumbers='+no+'&Text='+sms+'&TOMBOL=KIRIM'\\r\\n\\r\\naction = 'http://www.smsgratis.web.id/index.php?d=wg3&f=sms'\\r\\n\\r\\ntry:\\r\\n    send = buka.open(action,data)\\r\\n    req = send.read()\\r\\n    send.close()\\r\\n\\r\\n    print '[+] Congratulation...'\\r\\n    print '[+] SMS wass successfull send to number : %s' % no\\r\\n    print '[+] Your Message is: %s' % sms\\r\\n\\r\\nexcept IOError:\\r\\n    print '[-] Upps..! Failed send SMS.'\\r\\n    sys.exit()\\r\\n```\",\n            \"keywords\": \"SMS via Python, python sms, python sms sender, sms, sms via python, sms via internet\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        }\n    ]\n}"},{"id":"61ebf0e4-16ea-4a21-8acd-7e8324a25967","name":"Success - By Author","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":{"raw":"{{url}}/api/v1/post/?author__username=agaust","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"author__username","value":"agaust"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 22:27:07 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"53193"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 100,\n    \"page_size\": 20,\n    \"current_page\": 1,\n    \"next\": \"http://127.0.0.1:8000/api/v1/post/?author__username=agaust&page=2\",\n    \"previous\": null,\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 100,\n            \"absolute_url\": \"/posts/detail/how-to-custom-select-language-icon-in-django-administration/\",\n            \"created_at\": \"2020-10-10T10:42:40.853341\",\n            \"updated_at\": \"2020-10-10T10:42:40.860180\",\n            \"title\": \"How to custom select language icon in django administration\",\n            \"slug\": \"how-to-custom-select-language-icon-in-django-administration\",\n            \"description\": \"![change-language.png](https://i.imgur.com/qIhI550.png) \\r\\n\\r\\n\\r\\n\\r\\n**1. Add the base_site file inside `templates/admin/base_site.html`.**\\r\\n\\r\\n```html\\r\\n{% extends \\\"admin/base.html\\\" %}\\r\\n{% load static i18n %}\\r\\n\\r\\n{% block title %}{{ title }} | {{ site_title|default:_('Situs django admin') }}{% endblock %}\\r\\n\\r\\n{% block branding %}\\r\\n<h1 id=\\\"site-name\\\"><a href=\\\"{% url 'admin:index' %}\\\">{{ site_header|default:_('Administrasi django') }}</a></h1>\\r\\n{% endblock %}\\r\\n\\r\\n{% block nav-global %}{% endblock %}\\r\\n\\r\\n{% block welcome-msg %}\\r\\n\\r\\n  {# CUSTOM LANGUAGE ICONS #}\\r\\n  {% get_current_language as LANGUAGE_CODE %}\\r\\n  {% get_available_languages as LANGUAGES %}\\r\\n  {% get_language_info_list for LANGUAGES as languages %}\\r\\n  <span id=\\\"language-icons\\\" style=\\\"margin: -1px 0 0 -65px; position: absolute;\\\">\\r\\n    {% for language in languages %}\\r\\n      {% if language.code == 'id' %}\\r\\n        <a href=\\\"?lang=id\\\" style=\\\"margin-right: 3px;border-bottom:none\\\" title=\\\"Indonesia\\\">\\r\\n          <img height=\\\"15px\\\" src=\\\"{% static 'icons/flags/id.svg' %}\\\">\\r\\n        </a>\\r\\n      {% elif language.code == 'en' %}\\r\\n        <a href=\\\"?lang=en\\\" style=\\\"margin-right: 3px;border-bottom:none\\\" title=\\\"English\\\">\\r\\n          <img height=\\\"15px\\\" src=\\\"{% static 'icons/flags/us.svg' %}\\\">\\r\\n        </a>\\r\\n      {% endif %}\\r\\n    {% endfor %}\\r\\n  </span>\\r\\n\\r\\n  {# DFEAULT WELCOME MESSAGE GOES HERE #}\\r\\n  {{ block.super }}\\r\\n\\r\\n{% endblock %}\\r\\n```\\r\\n\\r\\n\\r\\n**2. Custom language middleware, in your file `middleware.py`**\\r\\n\\r\\n```\\r\\nfrom django.conf import settings\\r\\nfrom django.utils import translation\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\n\\r\\nclass LanguageMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def process_request(self, request):\\r\\n        \\\"\\\"\\\"\\r\\n        function to activate the translation\\r\\n        \\\"\\\"\\\"\\r\\n        if 'lang' in request.GET:\\r\\n            language = request.GET.get('lang', 'id')\\r\\n            if language in dict(settings.LANGUAGES).keys():\\r\\n                request.session['_language'] = language\\r\\n\\r\\n        language = request.session.get('_language', 'id')\\r\\n        translation.activate(language)\\r\\n```\\r\\n\\r\\n\\r\\n**3. And then in your `settings.py`**\\r\\n\\r\\n```\\r\\nTEMPLATES = [\\r\\n    {\\r\\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\\r\\n        'DIRS': [os.path.join(BASE_DIR, 'templates')],\\r\\n        'APP_DIRS': True,\\r\\n        'OPTIONS': {\\r\\n            'context_processors': [\\r\\n                'django.template.context_processors.debug',\\r\\n                'django.template.context_processors.request',\\r\\n                'django.contrib.auth.context_processors.auth',\\r\\n                'django.contrib.messages.context_processors.messages',\\r\\n            ],\\r\\n        },\\r\\n    },\\r\\n]\\r\\n\\r\\n\\r\\nMIDDLEWARE = [\\r\\n    'django.middleware.security.SecurityMiddleware',\\r\\n    'django.contrib.sessions.middleware.SessionMiddleware',\\r\\n    'django.middleware.common.CommonMiddleware',\\r\\n    'django.middleware.csrf.CsrfViewMiddleware',\\r\\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\\r\\n    'django.contrib.messages.middleware.MessageMiddleware',\\r\\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\\r\\n    'django.middleware.locale.LocaleMiddleware',\\r\\n\\r\\n    # custom middleware\\r\\n    'yourproject.middleware.LanguageMiddleware',\\r\\n]\\r\\n\\r\\n\\r\\n# Internationalization\\r\\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\\r\\nLANGUAGES = (\\r\\n    ('id', 'Indonesia'),\\r\\n    ('en', 'English')\\r\\n)\\r\\nLOCALE_PATHS = (\\r\\n    os.path.join(BASE_DIR, 'locale'),\\r\\n)\\r\\nDEFAULT_LANGUAGE = 1\\r\\nLANGUAGE_CODE = 'id'\\r\\nUSE_I18N = True\\r\\nUSE_L10N = True\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 24,\n                    \"name\": \"internationalization\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 19,\n                    \"name\": \"templates\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 99,\n            \"absolute_url\": \"/posts/detail/how-to-setup-all-raw_id_fields-and-search_fields-for-django/\",\n            \"created_at\": \"2020-10-10T10:42:40.840191\",\n            \"updated_at\": \"2020-10-10T10:42:40.848773\",\n            \"title\": \"How to setup all raw_id_fields and search_fields for django\",\n            \"slug\": \"how-to-setup-all-raw_id_fields-and-search_fields-for-django\",\n            \"description\": \"For example I have this 3 fields as `question_set`, `question` and `folder`.\\r\\nI need to assign all of this fields into `raw_id_fields` inside the `admin.ModelAdmin` without add manually per-single fields.\\r\\n\\r\\nthe basic way to enable raw id fields inside the `admin.ModelAdmin` look like this;\\r\\n\\r\\n\\r\\n```python\\r\\n@admin.register(QuestionList, site=admin_site)\\r\\nclass QuestionListAdmin(admin.ModelAdmin):\\r\\n    raw_id_fields = ('question_set', 'question', 'folder')    # manually\\r\\n```\\r\\n\\r\\nBut, can I setup all that `OneToOneField` and `ForeignKey` fields automatically into `raw_id_fields` without add it manually?\\r\\nsuch as applying the class mixin? sure can, to do it you can inspect the model,\\r\\nand search through the fields for instances of `ForeignKey`,\\r\\nand add the name to the tuple, for example with:\\r\\n\\r\\n\\r\\n```python\\r\\nclass DefaultAdminMixin:\\r\\n    \\\"\\\"\\\"\\r\\n    class mixin to setup default `raw_id_fields` and `search_fields`.\\r\\n    \\\"\\\"\\\"\\r\\n    raw_id_fields = ()\\r\\n    search_fields = ()\\r\\n\\r\\n    def __init__(self, model, admin_site, *args, **kwargs):\\r\\n        self.raw_id_fields = self.setup_raw_id_fields(model)\\r\\n        self.search_fields = self.setup_search_fields(model)\\r\\n        super().__init__(model, admin_site, *args, **kwargs)\\r\\n\\r\\n    def setup_raw_id_fields(self, model):\\r\\n        return tuple(\\r\\n            f.name\\r\\n            for f in model._meta.get_fields()\\r\\n            if isinstance(f, ForeignKey) or isinstance(f, OneToOneField)\\r\\n        )\\r\\n\\r\\n    def setup_search_fields(self, model):\\r\\n        return tuple(\\r\\n            f.name\\r\\n            for f in model._meta.get_fields()\\r\\n            if isinstance(f, CharField) or isinstance(f, TextField)\\r\\n        )\\r\\n```\\r\\n\\r\\n\\r\\nA `OneToOneField` is a subclass of a `ForeignKey`, so there is no need to make search for a `OneToOneField`.\\r\\nand to implement it, you can follow this below example;\\r\\n\\r\\n\\r\\n```python\\r\\n@admin.register(QuestionList, site=admin_site)\\r\\nclass QuestionListAdmin(DefaultAdminMixin, admin.ModelAdmin):\\r\\n    pass\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 98,\n            \"absolute_url\": \"/posts/detail/awesome-django-books-by-agiliqcom/\",\n            \"created_at\": \"2020-10-10T10:42:40.822800\",\n            \"updated_at\": \"2020-10-10T10:42:40.833855\",\n            \"title\": \"Awesome django books by agiliq.com\",\n            \"slug\": \"awesome-django-books-by-agiliqcom\",\n            \"description\": \"This awesome django books for refference is also open sourced at https://github.com/agiliq/books\\r\\n\\r\\n- Django Admin Cookbook (Django 2.0)\\r\\n- Django ORM Cookbook (Django 2.0)\\r\\n- Building APIs with Django and Django Rest Framework (Django 2.0)\\r\\n- Building Multi Tenant Applications with Django (Django 2.0)\\r\\n- Journeyman Python (Python 3.6)\\r\\n- Essential Python Tools (Python 3.6)\\r\\n- Tweetable Python (Python 3.6)\\r\\n- Django Projects Cookbook (Django 2.0)\\r\\n- Django Design Patterns (Outdated)\\r\\n- Software consulting Howto (2011)\\r\\n- Visual Arts with Python (Python 3.6)\\r\\n- Django Gotchas (Outdated)\\r\\n\\r\\n![books by agiliq.com](https://i.imgur.com/Gy7cGCO.png)\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 41,\n                    \"name\": \"refferences\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"django-rest-framework\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 33,\n                    \"name\": \"django-orm\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 97,\n            \"absolute_url\": \"/posts/detail/how-to-automaticly-backup-your-projects-into-external-hardisk-in-ubuntu/\",\n            \"created_at\": \"2020-10-10T10:42:40.807953\",\n            \"updated_at\": \"2020-10-10T10:42:40.817468\",\n            \"title\": \"How to automaticly backup your projects into external hardisk in ubuntu?\",\n            \"slug\": \"how-to-automaticly-backup-your-projects-into-external-hardisk-in-ubuntu\",\n            \"description\": \"Rsync, which stands for \\\"remote sync\\\", is a remote and local file synchronization tool. It uses an algorithm that minimizes the amount of data copied by only moving the portions of files that have changed. So, you can use `rsync` to handle this case.\\r\\n\\r\\nRsync is a very flexible network-enabled syncing tool. It can also refer to the network protocol developed to utilize this tool. When we reference rsync in this guide, we are mainly referring to the utility, and not the protocol. \\r\\n\\r\\nDue to its ubiquity on Linux and Unix-like systems and its popularity as a tool for system scripts, it is included on most Linux distributions by default.\\r\\n\\r\\nFor example:\\r\\n\\r\\n```bash\\r\\nrsync -a --exclude \\\"*.pyc\\\" /path/to/origin-directory/* /path/to/destination/\\r\\n```\\r\\n\\r\\nAnd then, add your command into bash file:\\r\\n\\r\\n\\r\\n```bash\\r\\n#!/bin/bash\\r\\n\\r\\nORIGIN=\\\"/home/yourusername/projects/*\\\"\\r\\nDESTINATION=\\\"/media/yourusername/Elements/jobs/projects/\\\"\\r\\n\\r\\nif [ -d $DESTINATION ]; then\\r\\n    rsync -a --exclude \\\"*.pyc\\\" $ORIGIN $DESTINATION;\\r\\n    echo \\\"Updated at:\\\" $(date);\\r\\nelse\\r\\n    echo \\\"Path $DESTINATION not found.\\\";\\r\\n    echo \\\"Not updated at:\\\" $(date);\\r\\nfi\\r\\n```\\r\\n\\r\\nChange mode for your bash file:\\r\\n\\r\\n```\\r\\n$ chmod +x autosync.sh\\r\\n```\\r\\n\\r\\nDon't miss to add into cronjobs\\r\\n\\r\\n```\\r\\n$ crontab -e\\r\\n```\\r\\n\\r\\nthen, in your editor:\\r\\n\\r\\n\\r\\n```\\r\\n# Select shell mode\\r\\nSHELL=/bin/bash\\r\\n\\r\\n\\r\\n# sync the folders for every hours, for more: https://crontab.guru/every-1-hour\\r\\n0 * * * * /home/yourusername/tools/autosync.sh > /yourusername/tools/autosync.log 2>&1\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 40,\n                    \"name\": \"ubuntu\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 5,\n                    \"name\": \"directory\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 96,\n            \"absolute_url\": \"/posts/detail/how-to-create-django-language-middleware/\",\n            \"created_at\": \"2020-10-10T10:42:40.794969\",\n            \"updated_at\": \"2020-10-10T10:42:40.803118\",\n            \"title\": \"How to create Django Language Middleware\",\n            \"slug\": \"how-to-create-django-language-middleware\",\n            \"description\": \"This example below to setup default language code as `id` (Indonesian).\\r\\n\\r\\n\\r\\n1. Your file `middleware.py`\\r\\n\\r\\n\\r\\n```python\\r\\n# -*- coding: utf-8 -*-\\r\\n\\r\\nfrom django.conf import settings\\r\\nfrom django.utils import translation\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\n\\r\\nclass LanguageMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def process_request(self, request):\\r\\n        \\\"\\\"\\\"\\r\\n        function to activate the translation\\r\\n        \\\"\\\"\\\"\\r\\n        if 'lang' in request.GET:\\r\\n            language = request.GET.get('lang', 'id')\\r\\n            if language in dict(settings.LANGUAGES).keys():\\r\\n                request.session['_language'] = language\\r\\n\\r\\n        language = request.session.get('_language', 'id')\\r\\n        translation.activate(language)\\r\\n```\\r\\n\\r\\n\\r\\n2. And then in your `settings.py`\\r\\n\\r\\n\\r\\n```python\\r\\nMIDDLEWARE = [\\r\\n    'django.middleware.security.SecurityMiddleware',\\r\\n    'django.contrib.sessions.middleware.SessionMiddleware',\\r\\n    'django.middleware.common.CommonMiddleware',\\r\\n    'django.middleware.csrf.CsrfViewMiddleware',\\r\\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\\r\\n    'django.contrib.messages.middleware.MessageMiddleware',\\r\\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\\r\\n    'django.middleware.locale.LocaleMiddleware',\\r\\n\\r\\n    # custom middleware\\r\\n    'yourproject.middleware.LanguageMiddleware',\\r\\n]\\r\\n\\r\\n\\r\\n# Internationalization\\r\\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\\r\\nLANGUAGES = (\\r\\n    ('id', 'Indonesia'),\\r\\n    ('en', 'English')\\r\\n)\\r\\nLOCALE_PATHS = (\\r\\n    os.path.join(BASE_DIR, 'locale'),\\r\\n)\\r\\nDEFAULT_LANGUAGE = 1\\r\\nLANGUAGE_CODE = 'id'\\r\\nUSE_I18N = True\\r\\nUSE_L10N = True\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 24,\n                    \"name\": \"internationalization\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 16,\n                    \"name\": \"settings\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 95,\n            \"absolute_url\": \"/posts/detail/how-to-make-a-notification-when-terminal-process-is-complete/\",\n            \"created_at\": \"2020-10-10T10:42:40.781333\",\n            \"updated_at\": \"2020-10-10T10:42:40.787489\",\n            \"title\": \"How to make a notification when terminal process is complete\",\n            \"slug\": \"how-to-make-a-notification-when-terminal-process-is-complete\",\n            \"description\": \"I have started a long process through a terminal. Is it possible to make the Ubuntu terminal make a sound once the process is complete? This way, I don’t need to keep checking, but will instead be notified through a sound or another notification.\\r\\n\\r\\nYou can use this some alternatives;\\r\\n\\r\\n\\r\\n```bash\\r\\n$ your-bash-command && aplay /path/to/sound.wav  # can also with *.ogg file.\\r\\n```\\r\\n\\r\\n```bash\\r\\n$ your-bash-command && paplay /path/to/sound.ogg  # can also with *.wav file.\\r\\n```\\r\\n\\r\\n```bash\\r\\n$ your-bash-command; spd-say \\\"done\\\"\\r\\n```\\r\\n\\r\\n```bash\\r\\n$ your-bash-command && notify-send \\\"done\\\"  # without sound\\r\\n$ your-bash-command && notify-send \\\"Process completed\\\" \\\"Come back to the terminal, the task is over\\\"\\r\\n```\\r\\n\\r\\n------------\\r\\n\\r\\nAnd this script below is modification of that commands above.\\r\\n\\r\\n1. Create the `notif-me.sh` file;\\r\\n\\r\\n```bash\\r\\n#!/bin/bash\\r\\n\\r\\nnotify-send \\\"Process completed\\\" \\\"Come back to the terminal, the task is over\\\"\\r\\nspd-say \\\"My lord, your process hasbeen complete.\\\"\\r\\n```\\r\\n\\r\\n2. Make it callable in `/bin`\\r\\n\\r\\n```bash\\r\\nsudo cp notif-me.sh /bin/notif-me;\\r\\n```\\r\\n\\r\\n3. Use it;\\r\\n\\r\\n```bash\\r\\n$ your-bash-command; notif-me\\r\\n\\r\\n# or \\r\\n\\r\\n$ your-bash-command && notif-me\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 94,\n            \"absolute_url\": \"/posts/detail/django-standard-api-response-middleware-for-drf/\",\n            \"created_at\": \"2020-10-10T10:42:40.768715\",\n            \"updated_at\": \"2020-10-10T10:42:40.775974\",\n            \"title\": \"Django Standard API Response Middleware for DRF\",\n            \"slug\": \"django-standard-api-response-middleware-for-drf\",\n            \"description\": \"As you can see, if you using django-rest-framework, you will found many different response format. This middleware to solve all of these problems with implement the Standard API Response.\\r\\n\\r\\nAll HTTP Response status stored into json response, not in HTTP Status (because mobile application, like android can't fetch the response body when HTTP Status >= 400).\\r\\n\\r\\n\\r\\n### `middleware.py`\\r\\n\\r\\n\\r\\n```python\\r\\nimport json\\r\\nimport copy\\r\\n\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\nfrom django.core.serializers.json import DjangoJSONEncoder\\r\\n\\r\\nfrom rest_framework import status\\r\\n\\r\\n\\r\\nclass BaseAPIResponseMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def render_response(self, response):\\r\\n        \\\"\\\"\\\"\\r\\n        function to fixed the response API following with this format:\\r\\n\\r\\n        [1] success single\\r\\n            {\\r\\n             \\\"status\\\": 200,\\r\\n             \\\"success\\\": true,\\r\\n             \\\"message\\\": \\\"The success message\\\",\\r\\n             \\\"result\\\": {}\\r\\n            }\\r\\n\\r\\n        [2] success list\\r\\n            {\\r\\n               \\\"status\\\": 200,\\r\\n               \\\"success\\\": true,\\r\\n               \\\"message\\\": null,\\r\\n               \\\"results\\\": [],\\r\\n\\r\\n               \\\"count\\\": 2,\\r\\n               \\\"page_size\\\": 5,\\r\\n               \\\"current_page\\\": 1,\\r\\n               \\\"next\\\": \\\"{{url}}/api/page/?page=2&search=a\\\",\\r\\n               \\\"previous\\\": null\\r\\n            }\\r\\n\\r\\n        [3] failed\\r\\n            {\\r\\n               \\\"status\\\": 400,\\r\\n               \\\"success\\\": false,\\r\\n               \\\"message\\\": \\\"The failed message\\\",\\r\\n               \\\"result\\\": {}\\r\\n            }\\r\\n        \\\"\\\"\\\"\\r\\n        default_response_keys = ('status', 'status_http', 'detail', 'message',\\r\\n                                 'success', 'non_field_errors', 'count',\\r\\n                                 'page_size', 'current_page', 'next',\\r\\n                                 'previous', 'result', 'results')\\r\\n        response_data = copy.deepcopy(response.data)\\r\\n\\r\\n        # setup default result if doesn't exist\\r\\n        if not any(['result' in response_data, 'results' in response_data]):\\r\\n            response_data.update({'result': {}})\\r\\n\\r\\n        # setup default message into response data\\r\\n        if 'message' not in response_data:\\r\\n            response_data.update({'message': None})\\r\\n\\r\\n        # store the status_code into response data\\r\\n        if 'status' not in response_data:\\r\\n            response_data.update({'status': response.status_code})\\r\\n\\r\\n        # store the status_http into response data\\r\\n        if 'status_http' not in response_data:\\r\\n            response_data.update({'status_http': response.status_code})\\r\\n\\r\\n        # updating the response message\\r\\n        if 'detail' in response_data:\\r\\n            response_data.update({'message': response_data.get('detail')})\\r\\n            del response_data['detail']\\r\\n\\r\\n        elif 'non_field_errors' in response_data:\\r\\n            response_errors = '<br />'.join(response_data.get('non_field_errors'))\\r\\n            response_data.update({'message': response_errors})\\r\\n            del response_data['non_field_errors']\\r\\n\\r\\n        # store the success boolean into response data\\r\\n        if response.status_code >= 400:\\r\\n            response_errors = []\\r\\n            response_errors_keys = []\\r\\n\\r\\n            for (key, value) in response_data.items():\\r\\n                if key not in default_response_keys:\\r\\n                    errors = ' '.join([str(v) for v in value])\\r\\n                    errors = '%s: %s' % (key, errors)\\r\\n                    response_errors.append(errors)\\r\\n                    response_errors_keys.append(key)\\r\\n\\r\\n            if len(response_errors) > 0:\\r\\n                response_errors = '<br />'.join(response_errors)\\r\\n                response_data.update({'message': response_errors})\\r\\n\\r\\n            # deleting the errors in the field keys.\\r\\n            if len(response_errors_keys) > 0:\\r\\n                list(map(response_data.pop, response_errors_keys))\\r\\n\\r\\n            if not response_data.get('message'):\\r\\n                response_data.update({'message': _('Failed')})\\r\\n\\r\\n            response_data.update({'success': False,\\r\\n                                  'status_http': status.HTTP_200_OK})\\r\\n\\r\\n        elif response.status_code >= 100:\\r\\n            if not response_data.get('message'):\\r\\n                response_data.update({'message': _('Success')})\\r\\n\\r\\n            if 'success' not in response_data:\\r\\n                response_data.update({'success': True})\\r\\n\\r\\n        return response_data\\r\\n\\r\\n    def process_response(self, request, response):\\r\\n        if hasattr(response, 'data') and isinstance(response.data, dict):\\r\\n            try:\\r\\n                response_data = self.render_response(response)\\r\\n                response.status_code = response_data.get('status_http')\\r\\n\\r\\n                if 'status_http' in response_data:\\r\\n                    del response_data['status_http']\\r\\n\\r\\n                response.data = response_data\\r\\n                response.content = json.dumps(response_data, cls=DjangoJSONEncoder)\\r\\n            except Exception:\\r\\n                pass\\r\\n\\r\\n        # handle error response but without `response.data`\\r\\n        # this error response specific for \\\"Server Error\\\" mode.\\r\\n        response_format = request.headers.get('Response-Format')\\r\\n        if (response.status_code >= 500) and (response_format == 'application/json'):\\r\\n            response_data = {'success': False, 'result': {},\\r\\n                             'status': response.status_code,\\r\\n                             'message': response.reason_phrase}\\r\\n            response.status_code = 200\\r\\n            response.data = response_data\\r\\n            response.content = json.dumps(response_data, cls=DjangoJSONEncoder)\\r\\n            response['Content-Type'] = 'application/json'\\r\\n\\r\\n        return response\\r\\n```\\r\\n\\r\\n\\r\\n### `paginator.py`\\r\\n\\r\\n\\r\\n```python\\r\\nfrom __future__ import unicode_literals\\r\\n\\r\\nfrom collections import OrderedDict\\r\\n\\r\\nfrom django.conf import settings\\r\\nfrom django.core.paginator import (Paginator, EmptyPage, PageNotAnInteger)\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\nfrom rest_framework import status\\r\\nfrom rest_framework.response import Response\\r\\nfrom rest_framework.pagination import (PageNumberPagination, LimitOffsetPagination)\\r\\n\\r\\n\\r\\nclass RestPagination(PageNumberPagination, LimitOffsetPagination):\\r\\n    \\\"\\\"\\\"\\r\\n    class FoobarPagiantion(RestPagination):\\r\\n        page_size = 10\\r\\n\\r\\n\\r\\n    class FoobarView(ListAPIView):\\r\\n        pagination_class = FoobarPagiantion\\r\\n    \\\"\\\"\\\"\\r\\n\\r\\n    def paginate_queryset(self, queryset, request, view=None):\\r\\n        limit = request.query_params.get('limit')\\r\\n        if str(limit).isdigit():\\r\\n            self.page_size = int(limit)\\r\\n        return super().paginate_queryset(queryset, request, view=view)\\r\\n\\r\\n    def get_paginated_response(self, results):\\r\\n        next_link = self.get_next_link() if self.get_next_link() is not None else ''\\r\\n        prev_link = self.get_previous_link() if self.get_previous_link() is not None else ''\\r\\n\\r\\n        if settings.USE_SSL:\\r\\n            next_link = next_link.replace('http:', 'https:')\\r\\n            prev_link = prev_link.replace('http:', 'https:')\\r\\n\\r\\n        return Response(OrderedDict([\\r\\n            ('count', self.page.paginator.count),\\r\\n            ('page_size', self.page_size),\\r\\n            ('current_page', self.page.number),\\r\\n            ('next', next_link if next_link != '' else None),\\r\\n            ('previous', prev_link if prev_link != '' else None),\\r\\n            ('status', status.HTTP_200_OK),\\r\\n            ('message', _('Success')),\\r\\n            ('success', True),\\r\\n            ('results', results)\\r\\n        ]))\\r\\n```\\r\\n\\r\\n\\r\\nFinally, don't miss to add your middleware into `settings.py`\\r\\n\\r\\n\\r\\n```python\\r\\nMIDDLEWARE = [\\r\\n    ....\\r\\n\\r\\n    'path.to.middleware.BaseAPIResponseMiddleware'\\r\\n]\\r\\n\\r\\n\\r\\nREST_FRAMEWORK = {\\r\\n    ....\\r\\n\\r\\n    'DEFAULT_PAGINATION_CLASS': 'path.to.paginator.RestPagination'\\r\\n}\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 38,\n                    \"name\": \"django-rest-framework\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 93,\n            \"absolute_url\": \"/posts/detail/idgenerator/\",\n            \"created_at\": \"2020-10-10T10:42:40.755260\",\n            \"updated_at\": \"2020-10-10T10:42:40.762949\",\n            \"title\": \"IDGenerator\",\n            \"slug\": \"idgenerator\",\n            \"description\": \"Generate a unique identifier of a specified fixed length consisting of the characters 0-9 and a-z. For example:\\r\\n```\\r\\nzcgst5od\\r\\n9x2zgn0l\\r\\nqa44sp0z\\r\\n61vv1nl5\\r\\numpprkbt\\r\\nylg4lmcy\\r\\ndec0lu1t\\r\\n38mhd8i5\\r\\nrx00yf0e\\r\\nkc2qdc07\\r\\n```\\r\\n\\r\\nHere is the solution:\\r\\n\\r\\n```python\\r\\nimport random\\r\\n\\r\\nclass IDGenerator(object):\\r\\n    ALPHABET = \\\"0123456789abcdefghijklmnopqrstuvwxyz\\\"\\r\\n\\r\\n    def __init__(self, length=8):\\r\\n        self._alphabet_length = len(self.ALPHABET)\\r\\n        self._id_length = length\\r\\n\\r\\n    def _encode_int(self, n):\\r\\n        # Adapted from:\\r\\n        #   Source: http://stackoverflow.com/a/561809/1497596\\r\\n        #   Author: http://stackoverflow.com/users/50902/kmkaplan\\r\\n\\r\\n        encoded = ''\\r\\n        while n > 0:\\r\\n            n, r = divmod(n, self._alphabet_length)\\r\\n            encoded = self.ALPHABET[r] + encoded\\r\\n        return encoded\\r\\n\\r\\n    def generate_id(self):\\r\\n        \\\"\\\"\\\"Generate an ID without leading zeros.\\r\\n        For example, for an ID that is eight characters in length, the\\r\\n        returned values will range from '10000000' to 'zzzzzzzz'.\\r\\n        \\\"\\\"\\\"\\r\\n\\r\\n        start = self._alphabet_length**(self._id_length - 1)\\r\\n        end = self._alphabet_length**self._id_length - 1\\r\\n        return self._encode_int(random.randint(start, end))\\r\\n\\r\\nif __name__ == \\\"__main__\\\":\\r\\n    # Sample usage: Generate ten IDs each eight characters in length.\\r\\n    idgen = IDGenerator(8)\\r\\n\\r\\n    for i in range(10):\\r\\n        print idgen.generate_id()\\r\\n```\\r\\n\\r\\nSource: http://stackoverflow.com/a/28075828/3445802\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 92,\n            \"absolute_url\": \"/posts/detail/move-multiple-files-using-bash/\",\n            \"created_at\": \"2020-10-10T10:42:40.742078\",\n            \"updated_at\": \"2020-10-10T10:42:40.749689\",\n            \"title\": \"move multiple files using bash\",\n            \"slug\": \"move-multiple-files-using-bash\",\n            \"description\": \"```\\r\\n# This method if the files has no extentions.\\r\\n$ for file in *; do mv \\\"$file\\\" \\\"$file.png\\\"; done\\r\\n\\r\\n# This method if the files has extentions before.\\r\\n$ for file in *.jpg; do mv \\\"$file\\\" \\\"$file.png\\\"; done\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 91,\n            \"absolute_url\": \"/posts/detail/deploy-django-at-heroku/\",\n            \"created_at\": \"2020-10-10T10:42:40.725580\",\n            \"updated_at\": \"2020-10-10T10:42:40.734258\",\n            \"title\": \"Deploy Django at Heroku\",\n            \"slug\": \"deploy-django-at-heroku\",\n            \"description\": \"**1.** Install heroku cli\\r\\n\\r\\n  https://devcenter.heroku.com/articles/heroku-cli\\r\\n\\r\\n**2.** Add `Procfile` to your project, and add this command below:\\r\\n\\r\\n```\\r\\n$ cd yourenv/yourproject/\\r\\n$ vim Procfile\\r\\n\\r\\n# then, add this command below to the file:\\r\\n\\r\\nweb: python manage.py runserver 0.0.0.0:$PORT --noreload\\r\\n```\\r\\n\\r\\n**3.** Add `runtimes.txt`\\r\\n\\r\\n  Add your python version, default is `python-2.7.13`. Docs: https://devcenter.heroku.com/articles/python-runtimes\\r\\n\\r\\n```\\r\\n$ cat runtime.txt\\r\\npython-3.5.2\\r\\n```\\r\\n\\r\\n**4.** Installing Whitenoise\\r\\n\\r\\nFirst, install WhiteNoise with pip, and add it to your requirements.txt file.\\r\\nDocs: https://devcenter.heroku.com/articles/django-assets#whitenoise\\r\\n\\r\\n```\\r\\n$ pip install whitenoise\\r\\n...\\r\\n$ pip freeze > requirements.txt\\r\\n```\\r\\n\\r\\nNext, install WhiteNoise into your Django application. This is done in `wsgi.py`.\\r\\n\\r\\n```python\\r\\nfrom django.core.wsgi import get_wsgi_application\\r\\nfrom whitenoise.django import DjangoWhiteNoise\\r\\n\\r\\napplication = get_wsgi_application()\\r\\napplication = DjangoWhiteNoise(application)\\r\\n```\\r\\n\\r\\nFinally, if you’d like gzip functionality enabled, add the following setting to `settings.py`.\\r\\n\\r\\n```\\r\\n# Simplified static file serving.\\r\\n# https://warehouse.python.org/project/whitenoise/\\r\\n\\r\\nSTATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'\\r\\n\\r\\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\\r\\n\\r\\n# Static files (CSS, JavaScript, Images)\\r\\n# https://docs.djangoproject.com/en/1.9/howto/static-files/\\r\\nSTATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')\\r\\nSTATIC_URL = '/static/'\\r\\n\\r\\n# Extra places for collectstatic to find static files.\\r\\nSTATICFILES_DIRS = (\\r\\n    os.path.join(PROJECT_ROOT, 'static'),\\r\\n)\\r\\n```\\r\\n\\r\\n**5.** Disabling Collectstatic\\r\\nSometimes, you may not want Heroku to run collectstatic on your behalf.\\r\\nYou can disable the collectstatic build step with the `DISABLE_COLLECTSTATIC` configuration:\\r\\nDocs: https://devcenter.heroku.com/articles/django-assets#disabling-collectstatic\\r\\n\\r\\n```\\r\\n$ heroku config:set DISABLE_COLLECTSTATIC=1\\r\\n```\\r\\n\\r\\n**6.** Login to heroku & Deploy\\r\\n\\r\\n```\\r\\n$ heroku login\\r\\n```\\r\\n\\r\\n**Create a new Git repository**\\r\\n\\r\\nInitialize a git repository in a new or existing directory\\r\\n\\r\\n```\\r\\n$ cd my-project/\\r\\n$ git init\\r\\n$ heroku git:remote -a your_app_name\\r\\n```\\r\\n\\r\\n**Deploy your application**\\r\\n\\r\\nCommit your code to the repository and deploy it to Heroku using Git.\\r\\n\\r\\n```\\r\\n$ git add .\\r\\n$ git commit -am \\\"make it better\\\"\\r\\n$ git push heroku master\\r\\n```\\r\\n\\r\\n**Existing Git repository**\\r\\n\\r\\nFor existing repositories, simply add the heroku remote\\r\\n\\r\\n```\\r\\n$ heroku git:remote -a your_app_name\\r\\n```\\r\\n\\r\\n**Database Migrations**\\r\\n\\r\\n```\\r\\n$ heroku run python manage.py migrate\\r\\n$ heroku run python manage.py makemigrations yourapp_name\\r\\n$ heroku run python manage.py migrate yourapp_name\\r\\n```\\r\\n\\r\\n```\\r\\n$ heroku ps\\r\\n$ heroku ps:scale web=1\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 30,\n                    \"name\": \"server\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 90,\n            \"absolute_url\": \"/posts/detail/markdown-syntax-to-resize-or-styling-the-image/\",\n            \"created_at\": \"2020-10-10T10:42:40.710025\",\n            \"updated_at\": \"2020-10-10T10:42:40.718984\",\n            \"title\": \"Markdown syntax to resize or styling the image\",\n            \"slug\": \"markdown-syntax-to-resize-or-styling-the-image\",\n            \"description\": \"This case was issued by muradaliyev88 in [django-markdown-editor](https://github.com/agusmakmun/django-markdown-editor/issues/18){target=\\\"_blank\\\"} repository. as [answered by rudolfbyker](https://stackoverflow.com/a/41169162/6396981){target=\\\"_blank\\\"} If you are writing MarkDown for PanDoc, you can do this:\\r\\n\\r\\n```\\r\\n![image-alt](drawing.jpg){height=100px}\\r\\n```\\r\\n\\r\\nor \\r\\n\\r\\n```\\r\\n![image-alt](drawing.jpg){style=\\\"border: 1px solid;height:100px\\\"}\\r\\n```\\r\\n\\r\\nresult example\\r\\n\\r\\n![martor-preview-result](https://raw.githubusercontent.com/agusmakmun/django-markdown-editor/master/__screenshot/martor-preview-result.png){style=\\\"border: 1px solid;height:100px\\\"}\\r\\n\\r\\n\\r\\n> This also work if using a-href `[link-title](https://to-link-url){target=\\\"_blank\\\"}`, eg: [link-title](https://to-link-url){target=\\\"_blank\\\"}\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 34,\n                    \"name\": \"markdown\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 19,\n                    \"name\": \"templates\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 89,\n            \"absolute_url\": \"/posts/detail/python-numberize-until-undefined-or-infinity-numbers/\",\n            \"created_at\": \"2020-10-10T10:42:40.696963\",\n            \"updated_at\": \"2020-10-10T10:42:40.703483\",\n            \"title\": \"Python numberize until undefined or infinity numbers\",\n            \"slug\": \"python-numberize-until-undefined-or-infinity-numbers\",\n            \"description\": \"Something we need to create the function to convert the number into string number, for example:\\r\\n1000 to 1.0 k, 1000000 to 1.0 m, etc.\\r\\n\\r\\n```python\\r\\ndef numberize(number):\\r\\n    scales = {\\r\\n        1000: 'k',\\r\\n        1000000: 'm',\\r\\n        1000000000: 'b',\\r\\n        1000000000000: 't',\\r\\n        1000000000000000: 'quad',\\r\\n        1000000000000000000: 'quin',\\r\\n        1000000000000000000000: 'sexti',\\r\\n        1000000000000000000000000: 'septi',\\r\\n        1000000000000000000000000000: 'octi',\\r\\n        1000000000000000000000000000000: 'noni',\\r\\n        1000000000000000000000000000000000: 'deci',\\r\\n        1000000000000000000000000000000000000: 'undeci',\\r\\n        1000000000000000000000000000000000000000: 'duodeci',\\r\\n        1000000000000000000000000000000000000000000: 'trede',\\r\\n        1000000000000000000000000000000000000000000000: 'quattu',\\r\\n        1000000000000000000000000000000000000000000000000: 'quindeci',\\r\\n        1000000000000000000000000000000000000000000000000000: 'sexdeci',\\r\\n        1000000000000000000000000000000000000000000000000000000: 'septend',\\r\\n        1000000000000000000000000000000000000000000000000000000000: 'octodeci',\\r\\n        1000000000000000000000000000000000000000000000000000000000000: 'novemdeci',\\r\\n        1000000000000000000000000000000000000000000000000000000000000000: 'vigintillion',\\r\\n        1000000000000000000000000000000000000000000000000000000000000000000: 'infinity'\\r\\n    }\\r\\n    number = int(number)\\r\\n    for digit, name in scales.items():\\r\\n        minimum = '9' * len(str(digit)[1:])\\r\\n        maximum = minimum + '999'\\r\\n\\r\\n        if number > max(scales):\\r\\n            return \\\"{0:.1f} \\\".format(number / max(scales)) + name\\r\\n\\r\\n        elif number > int(minimum) and number <= int(maximum):\\r\\n            return \\\"{0:.1f} \\\".format(number / digit) + name\\r\\n    return number\\r\\n```\\r\\n\\r\\nFor example\\r\\n\\r\\n\\r\\n```python\\r\\n>>> numberize(1000)\\r\\n1.0 k\\r\\n>>> numberize(1000000)\\r\\n1.0 m\\r\\n>>> numberize(100120009319931)\\r\\n100.1 t\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"looping\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"beginner\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 88,\n            \"absolute_url\": \"/posts/detail/upload-to-pypi-using-twine/\",\n            \"created_at\": \"2020-10-10T10:42:40.683444\",\n            \"updated_at\": \"2020-10-10T10:42:40.689803\",\n            \"title\": \"Upload to PyPi using twine\",\n            \"slug\": \"upload-to-pypi-using-twine\",\n            \"description\": \"[The Python Package Index (PyPI)](https://pypi.org) is a repository of software for the Python programming language. PyPI helps you find and install software developed and shared by the Python community.\\r\\n\\r\\n### 1. Install `twine`\\r\\n\\r\\n```\\r\\npip install twine\\r\\n```\\r\\n\\r\\n### 2. Create a dist file\\r\\n\\r\\n```\\r\\npython setup.py sdist\\r\\n```\\r\\n\\r\\n### 3. Upload using twine\\r\\n\\r\\n```\\r\\ntwine upload dist/*\\r\\n```\",\n            \"keywords\": \"pypi, twine\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 20,\n                    \"name\": \"news\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 12,\n                    \"name\": \"app\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 87,\n            \"absolute_url\": \"/posts/detail/difflib-similarity/\",\n            \"created_at\": \"2020-10-10T10:42:40.666839\",\n            \"updated_at\": \"2020-10-10T10:42:40.676583\",\n            \"title\": \"difflib similarity\",\n            \"slug\": \"difflib-similarity\",\n            \"description\": \"This module provides classes and functions for comparing sequences. It can be used for example, for comparing files, and can produce difference information in various formats, including HTML and context and unified diffs.\\r\\n\\r\\nReturn a list of the best \\\"good enough\\\" matches.\\r\\nword is a sequence for which close matches are desired (typically a string),\\r\\nand possibilities is a list of sequences against which to match word (typically a list of strings).\\r\\n\\r\\n[-] difflib is very slow if you going to work with large number of docs.\\r\\n\\r\\n- difflib.SequenceMatcher uses the Ratcliff/Obershelp algorithm it computes the doubled\\r\\n    number of matching characters divided by the total number of characters in the two strings.\\r\\n\\r\\n- Levenshtein uses Levenshtein algorithm it computes the minimum number of edits needed to transform one string into the other\\r\\n\\r\\n\\r\\nComplexity:\\r\\n\\r\\n- SequenceMatcher is quadratic time for the worst case and has expected-case behavior dependent\\r\\n    in a complicated way on how many elements the sequences have in common. (from here)\\r\\n\\r\\n- Levenshtein is O(m*n), where n and m are the length of the two input strings.\\r\\n\\r\\nPerformance:\\r\\n\\r\\n- According to the source code of the Levenshtein module : Levenshtein has a some overlap with difflib (SequenceMatcher).\\r\\n    It supports only strings, not arbitrary sequence types, but on the other hand it's much faster.\\r\\n\\r\\n\\r\\n```python\\r\\nimport difflib\\r\\n\\r\\n\\r\\ndef difflib_similarity_old(words1, words2):\\r\\n    \\\"\\\"\\\"\\r\\n    return float() words similarity using `difflib.get_close_matches`\\r\\n    with 1 is higgest score for this case.\\r\\n    \\\"\\\"\\\"\\r\\n    list_words1 = words1.split()\\r\\n    list_words2 = words2.split()\\r\\n\\r\\n    score = 0\\r\\n    similarity = difflib.get_close_matches\\r\\n\\r\\n    for word in list_words1:\\r\\n        if similarity(word, list_words2):\\r\\n            score += 1\\r\\n\\r\\n    return float(score) / float(len(list_words1))\\r\\n\\r\\n\\r\\ndef difflib_similarity(words1, words2):\\r\\n    \\\"\\\"\\\"\\r\\n    return float() words ratio using `difflib.SequenceMatcher`\\r\\n    \\\"\\\"\\\"\\r\\n    return difflib.SequenceMatcher(None, words1, words2).ratio()\\r\\n\\r\\n\\r\\nif __name__ == '__main__':\\r\\n    words1 = 'saya mencoba untuk lari sekencang mungkin'\\r\\n    words2 = 'anda lari dari tiang dengan sangat kencang'\\r\\n    print(difflib_similarity(words1, words2))  # 0.5\\r\\n```\\r\\n\\r\\n\\r\\nRefference:\\r\\n    - https://docs.python.org/3/library/difflib.html\\r\\n    - https://stackoverflow.com/a/11277680/6396981\\r\\n    - https://stackoverflow.com/q/6690739/6396981\",\n            \"keywords\": \"difflib, difflib similarity\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 86,\n            \"absolute_url\": \"/posts/detail/changewords-simply-python-tool-to-change-or-replace-the-text-string-in-the-files/\",\n            \"created_at\": \"2020-10-10T10:42:40.647757\",\n            \"updated_at\": \"2020-10-10T10:42:40.655561\",\n            \"title\": \"changewords - Simply python tool to change or replace the text string in the files\",\n            \"slug\": \"changewords-simply-python-tool-to-change-or-replace-the-text-string-in-the-files\",\n            \"description\": \"**changewords** is Simply python tool to change or replace the text string in the files. This tool pretty nice for programmers if somehow they want to replace/change their codes for many files, eg: function, class, variable, etc for recursive files or not.\\r\\n\\r\\nYou can directly install this tool from PyPI:\\r\\n\\r\\n```\\r\\n$ pip install changewords\\r\\n```\\r\\n\\r\\n**usage:**\\r\\n\\r\\n```\\r\\nusage: changewords [-h] [-p PATH] [-ft FILE_TYPE] [-fs FROM_STRING]\\r\\n                   [-ts TO_STRING]\\r\\n\\r\\nPython tool to change or replace the strings in files.\\r\\n\\r\\noptional arguments:\\r\\n  -h, --help            show this help message and exit\\r\\n  -p PATH, --path PATH  the file type you are looking for. eg: '.py', '.txt'\\r\\n                        by default is current path/folder.\\r\\n  -ft FILE_TYPE, --file_type FILE_TYPE\\r\\n                        file type you are looking for, eg: '.py', '.txt'\\r\\n  -fs FROM_STRING, --from_string FROM_STRING\\r\\n                        the string to change/replace\\r\\n  -ts TO_STRING, --to_string TO_STRING\\r\\n                        the string replacement\\r\\n```\\r\\n\\r\\n**example:**\\r\\n\\r\\n\\r\\n```\\r\\n$ changewords -p=mypath -ft=.py -fs=helloworld -ts=mantabjiwa\\r\\n\\r\\n# or\\r\\n\\r\\n$ changewords --path=mypath --file_type=.py --from_string=helloworld --to_string=mantabjiwa\\r\\n```\\r\\n\\r\\nSource: https://github.com/agusmakmun/changewords\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 20,\n                    \"name\": \"news\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"looping\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 5,\n                    \"name\": \"directory\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 85,\n            \"absolute_url\": \"/posts/detail/convert-all-mp4-files-into-mp3-files/\",\n            \"created_at\": \"2020-10-10T10:42:40.631349\",\n            \"updated_at\": \"2020-10-10T10:42:40.639193\",\n            \"title\": \"Convert all mp4 files into mp3 files\",\n            \"slug\": \"convert-all-mp4-files-into-mp3-files\",\n            \"description\": \"One method is a bash `*for loop*`.\\r\\n\\r\\nEasy convert to `.mp3` files:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *.mp4; do ffmpeg -i \\\"$f\\\" \\\"outputs/${f%.mp4}.mp3\\\"; done\\r\\n```\\r\\n\\r\\n\\r\\nFor converting only `.mp4` files:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *.mp4; do ffmpeg -i \\\"$f\\\" -c:a libmp3lame \\\"outputs/${f%.mp4}.mp3\\\"; done\\r\\n```\\r\\n\\r\\n\\r\\nFor converting `.m4a`, `.mov`, and `.flac`:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *.{m4a,mov,flac}; do ffmpeg -i \\\"$f\\\" -c:a libmp3lame \\\"outputs/${f%.*}.mp3\\\"; done\\r\\n```\\r\\n\\r\\n\\r\\nFor converting anything use the \\\"*\\\" wildcard:\\r\\n\\r\\n\\r\\n```\\r\\nmkdir outputs/\\r\\nfor f in *; do ffmpeg -i \\\"$f\\\" -c:a libmp3lame \\\"outputs/${f%.*}.mp3\\\"; done\\r\\n```\\r\\n\\r\\nRefference: https://stackoverflow.com/a/38485017/6396981\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 35,\n                    \"name\": \"bash\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 28,\n                    \"name\": \"linux\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 6,\n                    \"name\": \"looping\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 84,\n            \"absolute_url\": \"/posts/detail/martor-127-has-been-released/\",\n            \"created_at\": \"2020-10-10T10:42:40.613862\",\n            \"updated_at\": \"2020-10-10T10:42:40.621122\",\n            \"title\": \"Martor 1.2.7 has been released\",\n            \"slug\": \"martor-127-has-been-released\",\n            \"description\": \"![martor editor](https://raw.githubusercontent.com/agusmakmun/django-markdown-editor/master/__screenshot/martor-preview-editor.png)\\r\\n\\r\\nThis Martor is one of many plugin for django markdown editor. But in this case, martor still use [_Semantic UI_](https://semantic-ui.com) for the front-end.\\r\\nFor the previous version, martor included the features such as:\\r\\n\\r\\n* Live Preview\\r\\n* Integrated with Ace Editor\\r\\n* Integrated with Semantic-UI\\r\\n* Support Multiple Fields (fixed this issue)\\r\\n* Upload Image to imgur.com (via API) and custom uploader.\\r\\n* Direct Mention users @[username] - (require user to logged in)\\r\\n* Emoji :emoji_name: + Cheat sheets\\r\\n* Martor Commands Refference\\r\\n* Support Django Admin\\r\\n* Toolbar Buttons\\r\\n* Highlight pre\\r\\n\\r\\n\\r\\n**So, what's on offer in the latest version?**\\r\\n\\r\\n1. Support Django>=2.0\\r\\n2. Support embed/iframe video from (Youtube, Vimeo, Dailymotion, Yahoo, Veoh, & Metacafe)\\r\\n\\r\\n\\r\\nMartor is available directly from [PyPI](https://pypi.org/project/martor/), which following `pip` command:\\r\\n\\r\\n```\\r\\n$ pip install martor\\r\\n```\\r\\n\\r\\n> For the docs, you can checkout at the official repository: https://github.com/agusmakmun/django-markdown-editor\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 34,\n                    \"name\": \"markdown\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 83,\n            \"absolute_url\": \"/posts/detail/simple-adding-django-disqus-comments/\",\n            \"created_at\": \"2020-10-10T10:42:40.598005\",\n            \"updated_at\": \"2020-10-10T10:42:40.605916\",\n            \"title\": \"Simple Adding Django Disqus Comments\",\n            \"slug\": \"simple-adding-django-disqus-comments\",\n            \"description\": \"Simple Adding Django Disqus Comments, Disqus adalah salah satu comments plugin yang sangat populer saat ini. Selain facebook comments, google+ comments, disqus ini juga merupakan salah satu plugin favorite yang banyak digunakan para pengembang website. Selain tampilannya yang menarik, juga instalasinya yang simple dan tidak begitu rumit.\\r\\n\\r\\nDisqus Comments juga mensupport di Django, karena menurut saya pribadi Disqus Comments recomended ketika anda saat ini menggunakan Django, disamping face'nya yang lumayan baik, juga mudah dari segi instalasi.\\r\\n\\r\\nDjango disqus juga memberikan dokumentasi bagaimana cara instalasi, setting dan penggunaanya disini:[http://django-disqus.readthedocs.org/en/latest/installation.html](http://django-disqus.readthedocs.org/en/latest/installation.html \\\"Django Disqus\\\")\\r\\n\\r\\nDan pada bahasan kali ini, kita ambil contoh yang paling simple'nya.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nDalam instalasi ada beberapa cara, contohnya seperti menggunakan `pip`, `easy_install`, dan dengan cara menjalankan `setup.py` yang telah di extract.\\r\\n\\r\\n```\\r\\n$ pip install django-disqus\\r\\n```\\r\\n\\r\\n\\r\\nDan untuk setting apps dan api di `settings.py`, kurang lebih seperti ini:\\r\\n\\r\\n```\\r\\nINSTALLED_APPS = (\\r\\n     ...\\r\\n     'disqus',\\r\\n)\\r\\n\\r\\nDISQUS_API_KEY = 'FOOBARFOOBARFOOBARFOOBARFOOBARF'\\r\\nDISQUS_WEBSITE_SHORTNAME = 'foobar'\\r\\n```\\r\\n\\r\\n\\r\\nUntuk mendapatkan API disqus'nya bisa disini: [https://disqus.com/api/applications/](https://disqus.com/api/applications/ \\\"API Disqus\\\")\\r\\n\\r\\nDan untuk penempatan di template'nya seperti ini kurang lebihnya:\\r\\n\\r\\n```\\r\\n{% load disqus_tags %}\\r\\n{% set_disqus_identifier \\\"blogentry_\\\" object.title %}\\r\\n{% set_disqus_title page.title %}\\r\\n{% disqus_show_comments %}\\r\\n{% disqus_dev %}\\r\\n```\\r\\n\\r\\n\\r\\nSemoga bermanfaat.\\r\\n\\r\\nSource:\\r\\n- http://django-disqus.readthedocs.org/en/latest/installation.html\\r\\n- http://www.the-swamp.info/blog/adding-disqus-comments/\",\n            \"keywords\": \"django disqus, disqus, django, django disqus comments, disqus comments, tutorial django disqus comments\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 82,\n            \"absolute_url\": \"/posts/detail/menggunakan-graph-api-facebook-sangat-mudah-dengan-facepy/\",\n            \"created_at\": \"2020-10-10T10:42:40.585865\",\n            \"updated_at\": \"2020-10-10T10:42:40.591859\",\n            \"title\": \"Menggunakan Graph API Facebook sangat mudah dengan Facepy\",\n            \"slug\": \"menggunakan-graph-api-facebook-sangat-mudah-dengan-facepy\",\n            \"description\": \"Menggunakan Graph API Facebook sangat mudah dengan Facepy, Facepy adalah salah satu module tambahan untuk Python Programming yang dikembangkan guna memanfaatkan Graph API Facebook.\\r\\n\\r\\nTerimakasih banyak kepada `Bos Dadang`, yang memberikan referensi ini. Beberapa test yang kami lakukan contohnya seperti post ke group, dan membuat status.\\r\\n\\r\\nJika beberapa waktu lalu saya juga pernah menggunkan salah satu module tambahan untuk python, yaitu`fbcmd`, namun sayangnya beberapa tahun lalu developer `fbcmd` menyatakan R.I.P dengan repository yang dibuatnya, karena hak akses dari facebook yang diperketat.\\r\\n\\r\\nJika ingin melihat script fbcmd yang kita kembangkan, bisa lihat di github:[https://github.com/agusmakmun/Status-Facebook-Menggunakan-Python](https://github.com/agusmakmun/Status-Facebook-Menggunakan-Python \\\"Python FBCMD\\\")\\r\\n\\r\\n![Menggunakan Graph API Facebook sangat mudah dengan Facepy](https://python.web.id/media/gallery/Group_Tester.png \\\"Menggunakan Graph API Facebook sangat mudah dengan Facepy\\\")\\r\\n\\r\\nGambar diatas adalah salah satu contoh result yang dihasilkan dari module `Facepy` ini.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nUntuk instalasinya sangat mudah, pastikan anda memiliki `pip`, jika dengan manual bisa di download --> extract dan menjalankan `setup.py`'nya.\\r\\n\\r\\n\\r\\n```\\r\\n$ pip install facepy\\r\\n```\\r\\n\\r\\n\\r\\n### Penggunaan\\r\\n\\r\\nPastikan anda telah membuat app facebooknya, jika belum bisa menggunakan Graph API Explorer. dan berikut ini beberapa setting yang perlu diperhatikan.\\r\\n\\r\\n- https://www.facebook.com/settings?tab=applications&section=all   --> change to public access.\\r\\n- http://facepy.readthedocs.org/en/latest/usage/graph-api.html     --> docs graph api.\\r\\n- https://developers.facebook.com/tools/explorer/                  --> change to allow some premission.\\r\\n- https://github.com/jgorset/facepy                                --> repository.\\r\\n\\r\\nDan dibawah ini adalah penggunaan simple dari `Facepy` ini.\\r\\n\\r\\n```\\r\\nfrom facepy import GraphAPI\\r\\nACCESS_TOKEN = 'tokentokentokentoken'\\r\\nID_GROUP_OR_PAGE = '1234567890'\\r\\ngraph = GraphAPI(ACCESS_TOKEN)\\r\\n\\r\\ngraph.post(ID_GROUP_OR_PAGE+'/feed', message='Test My Status on Group/Pages')\\r\\ngraph.post('me/feed', message='Test My Status')\\r\\n```\\r\\n\\r\\n\\r\\nDjango juga di sediakan loo.. :D Untuk lebih lengkapnya bisa langsung dikunjungi repository-nya di github:[https://github.com/jgorset/facepy](https://github.com/jgorset/facepy \\\"Facepy\\\")\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"facebook, api facebook, facepy, graph api facebook, python facebook, django facebook\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 81,\n            \"absolute_url\": \"/posts/detail/sms-via-python/\",\n            \"created_at\": \"2020-10-10T10:42:40.575722\",\n            \"updated_at\": \"2020-10-10T10:42:40.581592\",\n            \"title\": \"SMS via Python\",\n            \"slug\": \"sms-via-python\",\n            \"description\": \"SMS via Python – Sms via python kali ini kita hanya memanfaatkan salah satu website yang menyediakan layanan sms gratis ini. Jika ingin membuat [SMS Gateway, bisa disini](http://bloggersmart.net/membuat-mesin-sms-gateway-dengan-raspberry-pi-kalkun-sms-gammu/ \\\"sms gateway\\\").\\r\\n\\r\\n![SMS via Python](https://python.web.id/media/gallery/sms-success-2.jpg \\\"SMS via Python\\\")\\r\\n\\r\\n```\\r\\n\\\"\\\"\\\"\\r\\nName             : Python SMS Sender\\r\\nCreated By       : Agus Makmun (Summon Agus)\\r\\nBlog             : bloggersmart.net - python.web.id\\r\\nLicense          : GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007\\r\\nDocumentation    : https://github.com/agusmakmun/Some-Examples-of-Simple-Python-Script/\\r\\n\\\"\\\"\\\"\\r\\n\\r\\nimport cookielib\\r\\nimport urllib2\\r\\nimport sys\\r\\n\\r\\nsms = raw_input('[+] Enter your SMS Message: ')\\r\\nno = raw_input('[+] Enter your number: ')\\r\\n\\r\\nprint '[+] In the process sending SMS....'\\r\\n\\r\\nurl ='http://www.smsgratis.web.id'\\r\\nbuka =  urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))\\r\\ndata= 'Phonenumbers='+no+'&Text='+sms+'&TOMBOL=KIRIM'\\r\\n\\r\\naction = 'http://www.smsgratis.web.id/index.php?d=wg3&f=sms'\\r\\n\\r\\ntry:\\r\\n    send = buka.open(action,data)\\r\\n    req = send.read()\\r\\n    send.close()\\r\\n\\r\\n    print '[+] Congratulation...'\\r\\n    print '[+] SMS wass successfull send to number : %s' % no\\r\\n    print '[+] Your Message is: %s' % sms\\r\\n\\r\\nexcept IOError:\\r\\n    print '[-] Upps..! Failed send SMS.'\\r\\n    sys.exit()\\r\\n```\",\n            \"keywords\": \"SMS via Python, python sms, python sms sender, sms, sms via python, sms via internet\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                }\n            ]\n        }\n    ]\n}"},{"id":"8185e642-de3f-4730-b4b7-3b228797307b","name":"Success - Limitation","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":{"raw":"{{url}}/api/v1/post/?limit=1","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"limit","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:36:16 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"773"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 103,\n    \"page_size\": 1,\n    \"current_page\": 2,\n    \"next\": \"http://127.0.0.1:8000/api/v1/post/?limit=1&page=3\",\n    \"previous\": \"http://127.0.0.1:8000/api/v1/post/?limit=1\",\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 102,\n            \"absolute_url\": \"/posts/detail/hello-world-2-32/\",\n            \"created_at\": \"2020-10-10T17:56:56.445294\",\n            \"updated_at\": \"2020-10-10T17:56:56.445329\",\n            \"title\": \"Hello World 2 32\",\n            \"slug\": \"hello-world-2-32\",\n            \"description\": \"This is a description of hello world\",\n            \"keywords\": null,\n            \"meta_description\": null,\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 3,\n                    \"name\": \"api\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 2,\n                    \"name\": \"drf\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 1,\n                    \"name\": \"flask\",\n                    \"description\": \"\"\n                }\n            ]\n        }\n    ]\n}"},{"id":"9d853421-f665-48b4-88f7-f020259efcaa","name":"Error - Invalid Token","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token xxxxx","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 22:28:16 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"},{"id":"cb24eb28-8819-40d7-8c1b-8b20fe9eaed4","name":"Error - Invalid Page","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":{"raw":"{{url}}/api/v1/post/?page=99999","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"page","value":"99999"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 22:27:59 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"75"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 404,\n    \"result\": {},\n    \"message\": \"Invalid page.\",\n    \"success\": false\n}"},{"id":"f8abf641-b2ba-4270-b5e9-cc89fde35367","name":"Success - By Tag","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Token {{auth_token}}","type":"text"},{"key":"Response-Format","value":"application/json","type":"text"},{"key":"Accept-Language","value":"en","type":"text"}],"url":{"raw":"{{url}}/api/v1/post/?tags__name=django","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"tags__name","value":"django"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 22:27:37 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"66057"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"count\": 53,\n    \"page_size\": 20,\n    \"current_page\": 1,\n    \"next\": \"http://127.0.0.1:8000/api/v1/post/?page=2&tags__name=django\",\n    \"previous\": null,\n    \"status\": 200,\n    \"message\": \"Success\",\n    \"success\": true,\n    \"results\": [\n        {\n            \"id\": 100,\n            \"absolute_url\": \"/posts/detail/how-to-custom-select-language-icon-in-django-administration/\",\n            \"created_at\": \"2020-10-10T10:42:40.853341\",\n            \"updated_at\": \"2020-10-10T10:42:40.860180\",\n            \"title\": \"How to custom select language icon in django administration\",\n            \"slug\": \"how-to-custom-select-language-icon-in-django-administration\",\n            \"description\": \"![change-language.png](https://i.imgur.com/qIhI550.png) \\r\\n\\r\\n\\r\\n\\r\\n**1. Add the base_site file inside `templates/admin/base_site.html`.**\\r\\n\\r\\n```html\\r\\n{% extends \\\"admin/base.html\\\" %}\\r\\n{% load static i18n %}\\r\\n\\r\\n{% block title %}{{ title }} | {{ site_title|default:_('Situs django admin') }}{% endblock %}\\r\\n\\r\\n{% block branding %}\\r\\n<h1 id=\\\"site-name\\\"><a href=\\\"{% url 'admin:index' %}\\\">{{ site_header|default:_('Administrasi django') }}</a></h1>\\r\\n{% endblock %}\\r\\n\\r\\n{% block nav-global %}{% endblock %}\\r\\n\\r\\n{% block welcome-msg %}\\r\\n\\r\\n  {# CUSTOM LANGUAGE ICONS #}\\r\\n  {% get_current_language as LANGUAGE_CODE %}\\r\\n  {% get_available_languages as LANGUAGES %}\\r\\n  {% get_language_info_list for LANGUAGES as languages %}\\r\\n  <span id=\\\"language-icons\\\" style=\\\"margin: -1px 0 0 -65px; position: absolute;\\\">\\r\\n    {% for language in languages %}\\r\\n      {% if language.code == 'id' %}\\r\\n        <a href=\\\"?lang=id\\\" style=\\\"margin-right: 3px;border-bottom:none\\\" title=\\\"Indonesia\\\">\\r\\n          <img height=\\\"15px\\\" src=\\\"{% static 'icons/flags/id.svg' %}\\\">\\r\\n        </a>\\r\\n      {% elif language.code == 'en' %}\\r\\n        <a href=\\\"?lang=en\\\" style=\\\"margin-right: 3px;border-bottom:none\\\" title=\\\"English\\\">\\r\\n          <img height=\\\"15px\\\" src=\\\"{% static 'icons/flags/us.svg' %}\\\">\\r\\n        </a>\\r\\n      {% endif %}\\r\\n    {% endfor %}\\r\\n  </span>\\r\\n\\r\\n  {# DFEAULT WELCOME MESSAGE GOES HERE #}\\r\\n  {{ block.super }}\\r\\n\\r\\n{% endblock %}\\r\\n```\\r\\n\\r\\n\\r\\n**2. Custom language middleware, in your file `middleware.py`**\\r\\n\\r\\n```\\r\\nfrom django.conf import settings\\r\\nfrom django.utils import translation\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\n\\r\\nclass LanguageMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def process_request(self, request):\\r\\n        \\\"\\\"\\\"\\r\\n        function to activate the translation\\r\\n        \\\"\\\"\\\"\\r\\n        if 'lang' in request.GET:\\r\\n            language = request.GET.get('lang', 'id')\\r\\n            if language in dict(settings.LANGUAGES).keys():\\r\\n                request.session['_language'] = language\\r\\n\\r\\n        language = request.session.get('_language', 'id')\\r\\n        translation.activate(language)\\r\\n```\\r\\n\\r\\n\\r\\n**3. And then in your `settings.py`**\\r\\n\\r\\n```\\r\\nTEMPLATES = [\\r\\n    {\\r\\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\\r\\n        'DIRS': [os.path.join(BASE_DIR, 'templates')],\\r\\n        'APP_DIRS': True,\\r\\n        'OPTIONS': {\\r\\n            'context_processors': [\\r\\n                'django.template.context_processors.debug',\\r\\n                'django.template.context_processors.request',\\r\\n                'django.contrib.auth.context_processors.auth',\\r\\n                'django.contrib.messages.context_processors.messages',\\r\\n            ],\\r\\n        },\\r\\n    },\\r\\n]\\r\\n\\r\\n\\r\\nMIDDLEWARE = [\\r\\n    'django.middleware.security.SecurityMiddleware',\\r\\n    'django.contrib.sessions.middleware.SessionMiddleware',\\r\\n    'django.middleware.common.CommonMiddleware',\\r\\n    'django.middleware.csrf.CsrfViewMiddleware',\\r\\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\\r\\n    'django.contrib.messages.middleware.MessageMiddleware',\\r\\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\\r\\n    'django.middleware.locale.LocaleMiddleware',\\r\\n\\r\\n    # custom middleware\\r\\n    'yourproject.middleware.LanguageMiddleware',\\r\\n]\\r\\n\\r\\n\\r\\n# Internationalization\\r\\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\\r\\nLANGUAGES = (\\r\\n    ('id', 'Indonesia'),\\r\\n    ('en', 'English')\\r\\n)\\r\\nLOCALE_PATHS = (\\r\\n    os.path.join(BASE_DIR, 'locale'),\\r\\n)\\r\\nDEFAULT_LANGUAGE = 1\\r\\nLANGUAGE_CODE = 'id'\\r\\nUSE_I18N = True\\r\\nUSE_L10N = True\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 24,\n                    \"name\": \"internationalization\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 19,\n                    \"name\": \"templates\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 99,\n            \"absolute_url\": \"/posts/detail/how-to-setup-all-raw_id_fields-and-search_fields-for-django/\",\n            \"created_at\": \"2020-10-10T10:42:40.840191\",\n            \"updated_at\": \"2020-10-10T10:42:40.848773\",\n            \"title\": \"How to setup all raw_id_fields and search_fields for django\",\n            \"slug\": \"how-to-setup-all-raw_id_fields-and-search_fields-for-django\",\n            \"description\": \"For example I have this 3 fields as `question_set`, `question` and `folder`.\\r\\nI need to assign all of this fields into `raw_id_fields` inside the `admin.ModelAdmin` without add manually per-single fields.\\r\\n\\r\\nthe basic way to enable raw id fields inside the `admin.ModelAdmin` look like this;\\r\\n\\r\\n\\r\\n```python\\r\\n@admin.register(QuestionList, site=admin_site)\\r\\nclass QuestionListAdmin(admin.ModelAdmin):\\r\\n    raw_id_fields = ('question_set', 'question', 'folder')    # manually\\r\\n```\\r\\n\\r\\nBut, can I setup all that `OneToOneField` and `ForeignKey` fields automatically into `raw_id_fields` without add it manually?\\r\\nsuch as applying the class mixin? sure can, to do it you can inspect the model,\\r\\nand search through the fields for instances of `ForeignKey`,\\r\\nand add the name to the tuple, for example with:\\r\\n\\r\\n\\r\\n```python\\r\\nclass DefaultAdminMixin:\\r\\n    \\\"\\\"\\\"\\r\\n    class mixin to setup default `raw_id_fields` and `search_fields`.\\r\\n    \\\"\\\"\\\"\\r\\n    raw_id_fields = ()\\r\\n    search_fields = ()\\r\\n\\r\\n    def __init__(self, model, admin_site, *args, **kwargs):\\r\\n        self.raw_id_fields = self.setup_raw_id_fields(model)\\r\\n        self.search_fields = self.setup_search_fields(model)\\r\\n        super().__init__(model, admin_site, *args, **kwargs)\\r\\n\\r\\n    def setup_raw_id_fields(self, model):\\r\\n        return tuple(\\r\\n            f.name\\r\\n            for f in model._meta.get_fields()\\r\\n            if isinstance(f, ForeignKey) or isinstance(f, OneToOneField)\\r\\n        )\\r\\n\\r\\n    def setup_search_fields(self, model):\\r\\n        return tuple(\\r\\n            f.name\\r\\n            for f in model._meta.get_fields()\\r\\n            if isinstance(f, CharField) or isinstance(f, TextField)\\r\\n        )\\r\\n```\\r\\n\\r\\n\\r\\nA `OneToOneField` is a subclass of a `ForeignKey`, so there is no need to make search for a `OneToOneField`.\\r\\nand to implement it, you can follow this below example;\\r\\n\\r\\n\\r\\n```python\\r\\n@admin.register(QuestionList, site=admin_site)\\r\\nclass QuestionListAdmin(DefaultAdminMixin, admin.ModelAdmin):\\r\\n    pass\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 98,\n            \"absolute_url\": \"/posts/detail/awesome-django-books-by-agiliqcom/\",\n            \"created_at\": \"2020-10-10T10:42:40.822800\",\n            \"updated_at\": \"2020-10-10T10:42:40.833855\",\n            \"title\": \"Awesome django books by agiliq.com\",\n            \"slug\": \"awesome-django-books-by-agiliqcom\",\n            \"description\": \"This awesome django books for refference is also open sourced at https://github.com/agiliq/books\\r\\n\\r\\n- Django Admin Cookbook (Django 2.0)\\r\\n- Django ORM Cookbook (Django 2.0)\\r\\n- Building APIs with Django and Django Rest Framework (Django 2.0)\\r\\n- Building Multi Tenant Applications with Django (Django 2.0)\\r\\n- Journeyman Python (Python 3.6)\\r\\n- Essential Python Tools (Python 3.6)\\r\\n- Tweetable Python (Python 3.6)\\r\\n- Django Projects Cookbook (Django 2.0)\\r\\n- Django Design Patterns (Outdated)\\r\\n- Software consulting Howto (2011)\\r\\n- Visual Arts with Python (Python 3.6)\\r\\n- Django Gotchas (Outdated)\\r\\n\\r\\n![books by agiliq.com](https://i.imgur.com/Gy7cGCO.png)\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 41,\n                    \"name\": \"refferences\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 38,\n                    \"name\": \"django-rest-framework\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 33,\n                    \"name\": \"django-orm\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 10,\n                    \"name\": \"tricks\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 96,\n            \"absolute_url\": \"/posts/detail/how-to-create-django-language-middleware/\",\n            \"created_at\": \"2020-10-10T10:42:40.794969\",\n            \"updated_at\": \"2020-10-10T10:42:40.803118\",\n            \"title\": \"How to create Django Language Middleware\",\n            \"slug\": \"how-to-create-django-language-middleware\",\n            \"description\": \"This example below to setup default language code as `id` (Indonesian).\\r\\n\\r\\n\\r\\n1. Your file `middleware.py`\\r\\n\\r\\n\\r\\n```python\\r\\n# -*- coding: utf-8 -*-\\r\\n\\r\\nfrom django.conf import settings\\r\\nfrom django.utils import translation\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\n\\r\\nclass LanguageMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def process_request(self, request):\\r\\n        \\\"\\\"\\\"\\r\\n        function to activate the translation\\r\\n        \\\"\\\"\\\"\\r\\n        if 'lang' in request.GET:\\r\\n            language = request.GET.get('lang', 'id')\\r\\n            if language in dict(settings.LANGUAGES).keys():\\r\\n                request.session['_language'] = language\\r\\n\\r\\n        language = request.session.get('_language', 'id')\\r\\n        translation.activate(language)\\r\\n```\\r\\n\\r\\n\\r\\n2. And then in your `settings.py`\\r\\n\\r\\n\\r\\n```python\\r\\nMIDDLEWARE = [\\r\\n    'django.middleware.security.SecurityMiddleware',\\r\\n    'django.contrib.sessions.middleware.SessionMiddleware',\\r\\n    'django.middleware.common.CommonMiddleware',\\r\\n    'django.middleware.csrf.CsrfViewMiddleware',\\r\\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\\r\\n    'django.contrib.messages.middleware.MessageMiddleware',\\r\\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\\r\\n    'django.middleware.locale.LocaleMiddleware',\\r\\n\\r\\n    # custom middleware\\r\\n    'yourproject.middleware.LanguageMiddleware',\\r\\n]\\r\\n\\r\\n\\r\\n# Internationalization\\r\\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\\r\\nLANGUAGES = (\\r\\n    ('id', 'Indonesia'),\\r\\n    ('en', 'English')\\r\\n)\\r\\nLOCALE_PATHS = (\\r\\n    os.path.join(BASE_DIR, 'locale'),\\r\\n)\\r\\nDEFAULT_LANGUAGE = 1\\r\\nLANGUAGE_CODE = 'id'\\r\\nUSE_I18N = True\\r\\nUSE_L10N = True\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 24,\n                    \"name\": \"internationalization\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 16,\n                    \"name\": \"settings\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 94,\n            \"absolute_url\": \"/posts/detail/django-standard-api-response-middleware-for-drf/\",\n            \"created_at\": \"2020-10-10T10:42:40.768715\",\n            \"updated_at\": \"2020-10-10T10:42:40.775974\",\n            \"title\": \"Django Standard API Response Middleware for DRF\",\n            \"slug\": \"django-standard-api-response-middleware-for-drf\",\n            \"description\": \"As you can see, if you using django-rest-framework, you will found many different response format. This middleware to solve all of these problems with implement the Standard API Response.\\r\\n\\r\\nAll HTTP Response status stored into json response, not in HTTP Status (because mobile application, like android can't fetch the response body when HTTP Status >= 400).\\r\\n\\r\\n\\r\\n### `middleware.py`\\r\\n\\r\\n\\r\\n```python\\r\\nimport json\\r\\nimport copy\\r\\n\\r\\nfrom django.utils.deprecation import MiddlewareMixin\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\nfrom django.core.serializers.json import DjangoJSONEncoder\\r\\n\\r\\nfrom rest_framework import status\\r\\n\\r\\n\\r\\nclass BaseAPIResponseMiddleware(MiddlewareMixin):\\r\\n\\r\\n    def render_response(self, response):\\r\\n        \\\"\\\"\\\"\\r\\n        function to fixed the response API following with this format:\\r\\n\\r\\n        [1] success single\\r\\n            {\\r\\n             \\\"status\\\": 200,\\r\\n             \\\"success\\\": true,\\r\\n             \\\"message\\\": \\\"The success message\\\",\\r\\n             \\\"result\\\": {}\\r\\n            }\\r\\n\\r\\n        [2] success list\\r\\n            {\\r\\n               \\\"status\\\": 200,\\r\\n               \\\"success\\\": true,\\r\\n               \\\"message\\\": null,\\r\\n               \\\"results\\\": [],\\r\\n\\r\\n               \\\"count\\\": 2,\\r\\n               \\\"page_size\\\": 5,\\r\\n               \\\"current_page\\\": 1,\\r\\n               \\\"next\\\": \\\"{{url}}/api/page/?page=2&search=a\\\",\\r\\n               \\\"previous\\\": null\\r\\n            }\\r\\n\\r\\n        [3] failed\\r\\n            {\\r\\n               \\\"status\\\": 400,\\r\\n               \\\"success\\\": false,\\r\\n               \\\"message\\\": \\\"The failed message\\\",\\r\\n               \\\"result\\\": {}\\r\\n            }\\r\\n        \\\"\\\"\\\"\\r\\n        default_response_keys = ('status', 'status_http', 'detail', 'message',\\r\\n                                 'success', 'non_field_errors', 'count',\\r\\n                                 'page_size', 'current_page', 'next',\\r\\n                                 'previous', 'result', 'results')\\r\\n        response_data = copy.deepcopy(response.data)\\r\\n\\r\\n        # setup default result if doesn't exist\\r\\n        if not any(['result' in response_data, 'results' in response_data]):\\r\\n            response_data.update({'result': {}})\\r\\n\\r\\n        # setup default message into response data\\r\\n        if 'message' not in response_data:\\r\\n            response_data.update({'message': None})\\r\\n\\r\\n        # store the status_code into response data\\r\\n        if 'status' not in response_data:\\r\\n            response_data.update({'status': response.status_code})\\r\\n\\r\\n        # store the status_http into response data\\r\\n        if 'status_http' not in response_data:\\r\\n            response_data.update({'status_http': response.status_code})\\r\\n\\r\\n        # updating the response message\\r\\n        if 'detail' in response_data:\\r\\n            response_data.update({'message': response_data.get('detail')})\\r\\n            del response_data['detail']\\r\\n\\r\\n        elif 'non_field_errors' in response_data:\\r\\n            response_errors = '<br />'.join(response_data.get('non_field_errors'))\\r\\n            response_data.update({'message': response_errors})\\r\\n            del response_data['non_field_errors']\\r\\n\\r\\n        # store the success boolean into response data\\r\\n        if response.status_code >= 400:\\r\\n            response_errors = []\\r\\n            response_errors_keys = []\\r\\n\\r\\n            for (key, value) in response_data.items():\\r\\n                if key not in default_response_keys:\\r\\n                    errors = ' '.join([str(v) for v in value])\\r\\n                    errors = '%s: %s' % (key, errors)\\r\\n                    response_errors.append(errors)\\r\\n                    response_errors_keys.append(key)\\r\\n\\r\\n            if len(response_errors) > 0:\\r\\n                response_errors = '<br />'.join(response_errors)\\r\\n                response_data.update({'message': response_errors})\\r\\n\\r\\n            # deleting the errors in the field keys.\\r\\n            if len(response_errors_keys) > 0:\\r\\n                list(map(response_data.pop, response_errors_keys))\\r\\n\\r\\n            if not response_data.get('message'):\\r\\n                response_data.update({'message': _('Failed')})\\r\\n\\r\\n            response_data.update({'success': False,\\r\\n                                  'status_http': status.HTTP_200_OK})\\r\\n\\r\\n        elif response.status_code >= 100:\\r\\n            if not response_data.get('message'):\\r\\n                response_data.update({'message': _('Success')})\\r\\n\\r\\n            if 'success' not in response_data:\\r\\n                response_data.update({'success': True})\\r\\n\\r\\n        return response_data\\r\\n\\r\\n    def process_response(self, request, response):\\r\\n        if hasattr(response, 'data') and isinstance(response.data, dict):\\r\\n            try:\\r\\n                response_data = self.render_response(response)\\r\\n                response.status_code = response_data.get('status_http')\\r\\n\\r\\n                if 'status_http' in response_data:\\r\\n                    del response_data['status_http']\\r\\n\\r\\n                response.data = response_data\\r\\n                response.content = json.dumps(response_data, cls=DjangoJSONEncoder)\\r\\n            except Exception:\\r\\n                pass\\r\\n\\r\\n        # handle error response but without `response.data`\\r\\n        # this error response specific for \\\"Server Error\\\" mode.\\r\\n        response_format = request.headers.get('Response-Format')\\r\\n        if (response.status_code >= 500) and (response_format == 'application/json'):\\r\\n            response_data = {'success': False, 'result': {},\\r\\n                             'status': response.status_code,\\r\\n                             'message': response.reason_phrase}\\r\\n            response.status_code = 200\\r\\n            response.data = response_data\\r\\n            response.content = json.dumps(response_data, cls=DjangoJSONEncoder)\\r\\n            response['Content-Type'] = 'application/json'\\r\\n\\r\\n        return response\\r\\n```\\r\\n\\r\\n\\r\\n### `paginator.py`\\r\\n\\r\\n\\r\\n```python\\r\\nfrom __future__ import unicode_literals\\r\\n\\r\\nfrom collections import OrderedDict\\r\\n\\r\\nfrom django.conf import settings\\r\\nfrom django.core.paginator import (Paginator, EmptyPage, PageNotAnInteger)\\r\\nfrom django.utils.translation import ugettext_lazy as _\\r\\n\\r\\nfrom rest_framework import status\\r\\nfrom rest_framework.response import Response\\r\\nfrom rest_framework.pagination import (PageNumberPagination, LimitOffsetPagination)\\r\\n\\r\\n\\r\\nclass RestPagination(PageNumberPagination, LimitOffsetPagination):\\r\\n    \\\"\\\"\\\"\\r\\n    class FoobarPagiantion(RestPagination):\\r\\n        page_size = 10\\r\\n\\r\\n\\r\\n    class FoobarView(ListAPIView):\\r\\n        pagination_class = FoobarPagiantion\\r\\n    \\\"\\\"\\\"\\r\\n\\r\\n    def paginate_queryset(self, queryset, request, view=None):\\r\\n        limit = request.query_params.get('limit')\\r\\n        if str(limit).isdigit():\\r\\n            self.page_size = int(limit)\\r\\n        return super().paginate_queryset(queryset, request, view=view)\\r\\n\\r\\n    def get_paginated_response(self, results):\\r\\n        next_link = self.get_next_link() if self.get_next_link() is not None else ''\\r\\n        prev_link = self.get_previous_link() if self.get_previous_link() is not None else ''\\r\\n\\r\\n        if settings.USE_SSL:\\r\\n            next_link = next_link.replace('http:', 'https:')\\r\\n            prev_link = prev_link.replace('http:', 'https:')\\r\\n\\r\\n        return Response(OrderedDict([\\r\\n            ('count', self.page.paginator.count),\\r\\n            ('page_size', self.page_size),\\r\\n            ('current_page', self.page.number),\\r\\n            ('next', next_link if next_link != '' else None),\\r\\n            ('previous', prev_link if prev_link != '' else None),\\r\\n            ('status', status.HTTP_200_OK),\\r\\n            ('message', _('Success')),\\r\\n            ('success', True),\\r\\n            ('results', results)\\r\\n        ]))\\r\\n```\\r\\n\\r\\n\\r\\nFinally, don't miss to add your middleware into `settings.py`\\r\\n\\r\\n\\r\\n```python\\r\\nMIDDLEWARE = [\\r\\n    ....\\r\\n\\r\\n    'path.to.middleware.BaseAPIResponseMiddleware'\\r\\n]\\r\\n\\r\\n\\r\\nREST_FRAMEWORK = {\\r\\n    ....\\r\\n\\r\\n    'DEFAULT_PAGINATION_CLASS': 'path.to.paginator.RestPagination'\\r\\n}\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 38,\n                    \"name\": \"django-rest-framework\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 27,\n                    \"name\": \"solution\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 18,\n                    \"name\": \"problem\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 91,\n            \"absolute_url\": \"/posts/detail/deploy-django-at-heroku/\",\n            \"created_at\": \"2020-10-10T10:42:40.725580\",\n            \"updated_at\": \"2020-10-10T10:42:40.734258\",\n            \"title\": \"Deploy Django at Heroku\",\n            \"slug\": \"deploy-django-at-heroku\",\n            \"description\": \"**1.** Install heroku cli\\r\\n\\r\\n  https://devcenter.heroku.com/articles/heroku-cli\\r\\n\\r\\n**2.** Add `Procfile` to your project, and add this command below:\\r\\n\\r\\n```\\r\\n$ cd yourenv/yourproject/\\r\\n$ vim Procfile\\r\\n\\r\\n# then, add this command below to the file:\\r\\n\\r\\nweb: python manage.py runserver 0.0.0.0:$PORT --noreload\\r\\n```\\r\\n\\r\\n**3.** Add `runtimes.txt`\\r\\n\\r\\n  Add your python version, default is `python-2.7.13`. Docs: https://devcenter.heroku.com/articles/python-runtimes\\r\\n\\r\\n```\\r\\n$ cat runtime.txt\\r\\npython-3.5.2\\r\\n```\\r\\n\\r\\n**4.** Installing Whitenoise\\r\\n\\r\\nFirst, install WhiteNoise with pip, and add it to your requirements.txt file.\\r\\nDocs: https://devcenter.heroku.com/articles/django-assets#whitenoise\\r\\n\\r\\n```\\r\\n$ pip install whitenoise\\r\\n...\\r\\n$ pip freeze > requirements.txt\\r\\n```\\r\\n\\r\\nNext, install WhiteNoise into your Django application. This is done in `wsgi.py`.\\r\\n\\r\\n```python\\r\\nfrom django.core.wsgi import get_wsgi_application\\r\\nfrom whitenoise.django import DjangoWhiteNoise\\r\\n\\r\\napplication = get_wsgi_application()\\r\\napplication = DjangoWhiteNoise(application)\\r\\n```\\r\\n\\r\\nFinally, if you’d like gzip functionality enabled, add the following setting to `settings.py`.\\r\\n\\r\\n```\\r\\n# Simplified static file serving.\\r\\n# https://warehouse.python.org/project/whitenoise/\\r\\n\\r\\nSTATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'\\r\\n\\r\\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\\r\\n\\r\\n# Static files (CSS, JavaScript, Images)\\r\\n# https://docs.djangoproject.com/en/1.9/howto/static-files/\\r\\nSTATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')\\r\\nSTATIC_URL = '/static/'\\r\\n\\r\\n# Extra places for collectstatic to find static files.\\r\\nSTATICFILES_DIRS = (\\r\\n    os.path.join(PROJECT_ROOT, 'static'),\\r\\n)\\r\\n```\\r\\n\\r\\n**5.** Disabling Collectstatic\\r\\nSometimes, you may not want Heroku to run collectstatic on your behalf.\\r\\nYou can disable the collectstatic build step with the `DISABLE_COLLECTSTATIC` configuration:\\r\\nDocs: https://devcenter.heroku.com/articles/django-assets#disabling-collectstatic\\r\\n\\r\\n```\\r\\n$ heroku config:set DISABLE_COLLECTSTATIC=1\\r\\n```\\r\\n\\r\\n**6.** Login to heroku & Deploy\\r\\n\\r\\n```\\r\\n$ heroku login\\r\\n```\\r\\n\\r\\n**Create a new Git repository**\\r\\n\\r\\nInitialize a git repository in a new or existing directory\\r\\n\\r\\n```\\r\\n$ cd my-project/\\r\\n$ git init\\r\\n$ heroku git:remote -a your_app_name\\r\\n```\\r\\n\\r\\n**Deploy your application**\\r\\n\\r\\nCommit your code to the repository and deploy it to Heroku using Git.\\r\\n\\r\\n```\\r\\n$ git add .\\r\\n$ git commit -am \\\"make it better\\\"\\r\\n$ git push heroku master\\r\\n```\\r\\n\\r\\n**Existing Git repository**\\r\\n\\r\\nFor existing repositories, simply add the heroku remote\\r\\n\\r\\n```\\r\\n$ heroku git:remote -a your_app_name\\r\\n```\\r\\n\\r\\n**Database Migrations**\\r\\n\\r\\n```\\r\\n$ heroku run python manage.py migrate\\r\\n$ heroku run python manage.py makemigrations yourapp_name\\r\\n$ heroku run python manage.py migrate yourapp_name\\r\\n```\\r\\n\\r\\n```\\r\\n$ heroku ps\\r\\n$ heroku ps:scale web=1\\r\\n```\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 30,\n                    \"name\": \"server\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 84,\n            \"absolute_url\": \"/posts/detail/martor-127-has-been-released/\",\n            \"created_at\": \"2020-10-10T10:42:40.613862\",\n            \"updated_at\": \"2020-10-10T10:42:40.621122\",\n            \"title\": \"Martor 1.2.7 has been released\",\n            \"slug\": \"martor-127-has-been-released\",\n            \"description\": \"![martor editor](https://raw.githubusercontent.com/agusmakmun/django-markdown-editor/master/__screenshot/martor-preview-editor.png)\\r\\n\\r\\nThis Martor is one of many plugin for django markdown editor. But in this case, martor still use [_Semantic UI_](https://semantic-ui.com) for the front-end.\\r\\nFor the previous version, martor included the features such as:\\r\\n\\r\\n* Live Preview\\r\\n* Integrated with Ace Editor\\r\\n* Integrated with Semantic-UI\\r\\n* Support Multiple Fields (fixed this issue)\\r\\n* Upload Image to imgur.com (via API) and custom uploader.\\r\\n* Direct Mention users @[username] - (require user to logged in)\\r\\n* Emoji :emoji_name: + Cheat sheets\\r\\n* Martor Commands Refference\\r\\n* Support Django Admin\\r\\n* Toolbar Buttons\\r\\n* Highlight pre\\r\\n\\r\\n\\r\\n**So, what's on offer in the latest version?**\\r\\n\\r\\n1. Support Django>=2.0\\r\\n2. Support embed/iframe video from (Youtube, Vimeo, Dailymotion, Yahoo, Veoh, & Metacafe)\\r\\n\\r\\n\\r\\nMartor is available directly from [PyPI](https://pypi.org/project/martor/), which following `pip` command:\\r\\n\\r\\n```\\r\\n$ pip install martor\\r\\n```\\r\\n\\r\\n> For the docs, you can checkout at the official repository: https://github.com/agusmakmun/django-markdown-editor\",\n            \"keywords\": null,\n            \"meta_description\": \"\",\n            \"is_featured\": true,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 34,\n                    \"name\": \"markdown\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 9,\n                    \"name\": \"project\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 83,\n            \"absolute_url\": \"/posts/detail/simple-adding-django-disqus-comments/\",\n            \"created_at\": \"2020-10-10T10:42:40.598005\",\n            \"updated_at\": \"2020-10-10T10:42:40.605916\",\n            \"title\": \"Simple Adding Django Disqus Comments\",\n            \"slug\": \"simple-adding-django-disqus-comments\",\n            \"description\": \"Simple Adding Django Disqus Comments, Disqus adalah salah satu comments plugin yang sangat populer saat ini. Selain facebook comments, google+ comments, disqus ini juga merupakan salah satu plugin favorite yang banyak digunakan para pengembang website. Selain tampilannya yang menarik, juga instalasinya yang simple dan tidak begitu rumit.\\r\\n\\r\\nDisqus Comments juga mensupport di Django, karena menurut saya pribadi Disqus Comments recomended ketika anda saat ini menggunakan Django, disamping face'nya yang lumayan baik, juga mudah dari segi instalasi.\\r\\n\\r\\nDjango disqus juga memberikan dokumentasi bagaimana cara instalasi, setting dan penggunaanya disini:[http://django-disqus.readthedocs.org/en/latest/installation.html](http://django-disqus.readthedocs.org/en/latest/installation.html \\\"Django Disqus\\\")\\r\\n\\r\\nDan pada bahasan kali ini, kita ambil contoh yang paling simple'nya.\\r\\n\\r\\n### Instalasi\\r\\n\\r\\nDalam instalasi ada beberapa cara, contohnya seperti menggunakan `pip`, `easy_install`, dan dengan cara menjalankan `setup.py` yang telah di extract.\\r\\n\\r\\n```\\r\\n$ pip install django-disqus\\r\\n```\\r\\n\\r\\n\\r\\nDan untuk setting apps dan api di `settings.py`, kurang lebih seperti ini:\\r\\n\\r\\n```\\r\\nINSTALLED_APPS = (\\r\\n     ...\\r\\n     'disqus',\\r\\n)\\r\\n\\r\\nDISQUS_API_KEY = 'FOOBARFOOBARFOOBARFOOBARFOOBARF'\\r\\nDISQUS_WEBSITE_SHORTNAME = 'foobar'\\r\\n```\\r\\n\\r\\n\\r\\nUntuk mendapatkan API disqus'nya bisa disini: [https://disqus.com/api/applications/](https://disqus.com/api/applications/ \\\"API Disqus\\\")\\r\\n\\r\\nDan untuk penempatan di template'nya seperti ini kurang lebihnya:\\r\\n\\r\\n```\\r\\n{% load disqus_tags %}\\r\\n{% set_disqus_identifier \\\"blogentry_\\\" object.title %}\\r\\n{% set_disqus_title page.title %}\\r\\n{% disqus_show_comments %}\\r\\n{% disqus_dev %}\\r\\n```\\r\\n\\r\\n\\r\\nSemoga bermanfaat.\\r\\n\\r\\nSource:\\r\\n- http://django-disqus.readthedocs.org/en/latest/installation.html\\r\\n- http://www.the-swamp.info/blog/adding-disqus-comments/\",\n            \"keywords\": \"django disqus, disqus, django, django disqus comments, disqus comments, tutorial django disqus comments\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 77,\n            \"absolute_url\": \"/posts/detail/backup-and-restore-database-postgres-django-in-terminal-ssh/\",\n            \"created_at\": \"2020-10-10T10:42:40.514755\",\n            \"updated_at\": \"2020-10-10T10:42:40.522700\",\n            \"title\": \"Backup and Restore database Postgres Django in terminal ssh\",\n            \"slug\": \"backup-and-restore-database-postgres-django-in-terminal-ssh\",\n            \"description\": \"Backup and Restore database Postgres Django in terminal ssh. Bismillahirrahmanirrahim, malam hari ini kita akan berbagi sedikit tutorial yang diambil dari dokumentasi saya pribadi mengenai problem solved backup and restore database postgres django, yaitu tepatnya ketika sudah dalam keadaan di hosting.\\r\\n\\r\\nBeberapa tutorial telah dicoba satu-satu, dan alhamdulillah masih gagal, lalu bertanya-tanya kepada kang _**Fendi**_, alhamdulillah solved dalam menangani backup'nya. Hal ini saya lakukan karena pindah hosting ke [HelloWorldHost.com](https://helloworldhost.com) - punya'nya mas Hafidz.\\r\\n\\r\\n***)** Pastikan anda saat ini dalam keadaan mengakses ssh server hosting anda. biasanya seperti ini:  \\r\\n\\r\\n\\r\\n```\\r\\n$ ssh {user}@{ip_server} -p {port}\\r\\n```\\r\\n\\r\\n\\r\\n**Backup:**\\r\\n\\r\\n\\r\\n```\\r\\n$ pg_dump -U {db_user} {db_name} -f backup.db -h 127.0.0.1\\r\\n```\\r\\n\\r\\n**Restore:**\\r\\n\\r\\n\\r\\n```\\r\\n$ psql -U {db_user} -d {db_name} -f backup.db -h 127.0.0.1\\r\\n```\\r\\n\\r\\n\\r\\n***)** untuk restore, mohon perhatikan dimana file `backup.db` berada, dan pastikan sudah mengupload filenya dihosting.\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"Backup and Restore database Postgres Django in terminal ssh, Backup and Restore database Postgres Django, backup postgres, restore postgres\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 75,\n            \"absolute_url\": \"/posts/detail/update-about-author-django-blog-python-learning-v2/\",\n            \"created_at\": \"2020-10-10T10:42:40.482566\",\n            \"updated_at\": \"2020-10-10T10:42:40.490535\",\n            \"title\": \"[ update about author ] Django Blog Python Learning v.2\",\n            \"slug\": \"update-about-author-django-blog-python-learning-v2\",\n            \"description\": \"[ update about author ] Django Blog Python Learning v.2, bismillahirrahmanirrahim. Kali ini kita akan share update terbaru dari source code Django Blog Python Learning v.2 ini.\\r\\n\\r\\nYaitu **Update About Author** yang ada di setiap posts, bisa dilihat langsung dibawah posts ini. Lalu mana yang kita update?\\r\\n\\r\\n**1.** Pada bagian `blog/models.py` ditambahkan 1 field baru berupa `avatar`, seperti dibawah ini:\\r\\n\\r\\n\\r\\n```\\r\\nclass Author(models.Model):\\r\\n    name = models.CharField(max_length=200)\\r\\n    avatar = models.ImageField(upload_to='gallery', null=True, blank=True, help_text=\\\"Upload Image for Avatar\\\")\\r\\n    about = models.TextField(blank=True, null=True)\\r\\n    email = models.EmailField(max_length=200, blank=True, null=True, unique=True)\\r\\n    website = models.URLField(max_length=200, blank=True, null=True)\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Menampilkan **About Author** di template `posts.html`. Untuk letaknya tepat dibawah `{{ object.body|markdown }}`.\\r\\n\\r\\n```\\r\\n<div class=\\\"panel panel-default\\\">\\r\\n <div class=\\\"panel-heading\\\">Author</div>\\r\\n  <div class=\\\"panel-body\\\">\\r\\n    <div class=\\\"media\\\">\\r\\n      <div class=\\\"media-left media-middle\\\" style=\\\"float:left;margin-right:10px;\\\">\\r\\n        <a href=\\\"{{ entry.author.website }}\\\">\\r\\n          <img class=\\\"media-object\\\" alt=\\\"{{ entry.author.name }}\\\" title=\\\"{{ entry.author }}\\\" src=\\\"/media/{{ entry.author.avatar }}\\\" style=\\\"width:64px;height:64px;\\\">\\r\\n        </a>\\r\\n      </div>\\r\\n      <div class=\\\"media-body\\\">\\r\\n        <h4 class=\\\"media-heading\\\">{{ entry.author }}</h4>\\r\\n        {{ entry.author.about }}<br />\\r\\n          Website: <a href=\\\"{{ entry.author.website }}\\\" target=\\\"_blank\\\">{{ entry.author.website }}</a>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n```\\r\\n\\r\\n\\r\\nJika kurang jelas, bisa langsung kita lihat update'nya di github:\\r\\n\\r\\nUpdate `models.py`, [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/90a2263db14aa26645124ad0a561ee89b8567bc7](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/90a2263db14aa26645124ad0a561ee89b8567bc7 \\\"update models.py\\\")\\r\\n\\r\\nUpdate `post.html`, [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/b76b2812535da134e57708f0663bca5c43b3d0a7](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/b76b2812535da134e57708f0663bca5c43b3d0a7 \\\"update post.html\\\")\",\n            \"keywords\": \"[ update about author ] Django Blog Python Learning v.2, Django Blog Python Learning v.2, about author django, django blog\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 74,\n            \"absolute_url\": \"/posts/detail/update-pagination-sitemap-page-django-blog-python-learning-v2/\",\n            \"created_at\": \"2020-10-10T10:42:40.467224\",\n            \"updated_at\": \"2020-10-10T10:42:40.473905\",\n            \"title\": \"[ update pagination sitemap page ] Django Blog Python Learning v.2\",\n            \"slug\": \"update-pagination-sitemap-page-django-blog-python-learning-v2\",\n            \"description\": \"[ update pagination sitemap page ] Django Blog Python Learning v.2, bismillahirrahmanirrahim, pada kesempatan kali ini kita update lagi, setelah sebelumnya _update about author_, kali ini kita akan update lagi berupa **pagination sitemap page**.\\r\\n\\r\\nMengapa hal tersebut dilakukan? yap, karena seiring dengan adanya kemungkinan jumlah posts semakin besar, oleh karena memungkinkan pula scroll pada bowser akan semakin kecil karena banyak. oleh karena itu ada baiknya kita tambah sedikit menjadi pagination.\\r\\n\\r\\nSecara konsep sebenarnya sama seperti membuat pagination pada \\\"display al article under tag\\\", ataupun \\\"results query\\\". Lalu manakah yang kita ubah?\\r\\n\\r\\n**1.** Mengganti satu function `my_sitemap(request):` pada `myproject/views.py` menjadi seperti ini:\\r\\n\\r\\n```\\r\\ndef my_sitemap(request):\\r\\n    t = loader.get_template('sitemap.html')\\r\\n    all_entry = Entry.objects.all()\\r\\n    paginator = Paginator(all_entry, 10) #show 10 articles per page\\r\\n    page = request.GET.get('page')\\r\\n    try:\\r\\n        all_entry = paginator.page(page)\\r\\n    except PageNotAnInteger:\\r\\n        all_entry = paginator.page(1)\\r\\n    except EmptyPage:\\r\\n        all_entry = paginator.page(paginator.num_pages)\\r\\n    index = all_entry.number - 1\\r\\n    limit = 3 #limit for show range left and right of number pages\\r\\n    max_index = len(paginator.page_range)\\r\\n    start_index = index - limit if index >= limit else 0\\r\\n    end_index = index + limit if index <= max_index - limit else max_index\\r\\n    page_range = paginator.page_range[start_index:end_index]\\r\\n    c = Context({'all_entry':all_entry, 'page_range': page_range, })\\r\\n    return HttpResponse(t.render(c))\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Menambahkan pagination pada template `sitemap.html` yang letaknya tepat sebelum `{% endblock %}`untuk `{% block blog_entries %}`, atau dibawah end tag dari `<div class=\\\"post sitemap\\\">`.\\r\\n\\r\\n```\\r\\n<ul class=\\\"pagination\\\">\\r\\n  <li {% if not all_entry.has_previous %}class=\\\"disabled\\\"{% endif %}>\\r\\n     <a {% if all_entry.has_previous %}href=\\\"?page={{ all_entry.previous_page_number }}\\\" aria-label=\\\"Previous\\\" {% endif %}><span aria-hidden=\\\"true\\\">«</span></a>\\r\\n   </li>\\r\\n   <li><a href=\\\"?page=1\\\">First</a></li>\\r\\n  {% for linkpage in page_range %}\\r\\n      {% ifequal linkpage all_entry.number %}\\r\\n         <li class=\\\"active\\\">\\r\\n           <a href=\\\"#\\\">{{ all_entry.number }}<span class=\\\"sr-only\\\">(current)</span></a>\\r\\n         </li>\\r\\n      {% else %}\\r\\n         <li><a href=\\\"?page={{ linkpage }}\\\">{{ linkpage }}</a></li>\\r\\n      {% endifequal %}\\r\\n  {% endfor %}\\r\\n  <li><a href=\\\"?page={{ all_entry.paginator.num_pages }}\\\">Last</a></li>\\r\\n  <li {% if not all_entry.has_next %}class=\\\"disabled\\\"{% endif %}>\\r\\n     <a {% if all_entry.has_next %}href=\\\"?page={{ all_entry.next_page_number }}\\\" aria-label=\\\"Next\\\" {% endif %}><span aria-hidden=\\\"true\\\">»</span></a>\\r\\n   </li>\\r\\n</ul>\\r\\n```\\r\\n\\r\\n\\r\\nKeduanya jika masih bingung, di github juga kita update:\\r\\n\\r\\nUpdate `myproject/views.py`: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7026abbc22f8a14f3e130aec618c0ce3370f0a63](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7026abbc22f8a14f3e130aec618c0ce3370f0a63 \\\"update views.py\\\")\\r\\n\\r\\nUpdate `sitemap.html`: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/dd272f1f3892418e2886b81dc5f67c9a3d0a5b71](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/dd272f1f3892418e2886b81dc5f67c9a3d0a5b71 \\\"update sitemap.html\\\")\\r\\n\\r\\nJika terjadi problem, bisa langsung ditanyakan pada komentar dibawah. Semoga bermanfaat.\",\n            \"keywords\": \"[ update pagination sitemap page ] Django Blog Python Learning v.2, pagination sitemap page, pagination sitemap page django, django pagination, sitemap, django, Django Blog Python Learning\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 70,\n            \"absolute_url\": \"/posts/detail/update-display-post-under-author-django-blog-python-learning-v2/\",\n            \"created_at\": \"2020-10-10T10:42:40.408135\",\n            \"updated_at\": \"2020-10-10T10:42:40.417870\",\n            \"title\": \"[ update display post under author ] Django Blog Python Learning v.2\",\n            \"slug\": \"update-display-post-under-author-django-blog-python-learning-v2\",\n            \"description\": \"[ update display post under author ] Django Blog Python Learning v.2, bismillahhirrahmanirrahim. Selamat sore sobat, sudah 2x kita update mengenai Django Blog Python Learning v.2 ini.\\r\\n\\r\\nDan pada kesempatan sore hari ini, kita akan update mengenai `Display Article under Author`, beberapa clue yang sempat saya fikirkan adalah membuat field baru lagi di class `Author` pada `blog/models.py`, yaitu berupa `slug_filed` untuk author. Dan ending yang di inginkan menjadi kurang lebih seperti ini: `python.web.id/author/<author_name>`.\\r\\n\\r\\nNamun setelah berfikir kembali, sepertinya itu akan lebih membutuhkan proses yang njelimet. hehe.. Karena selain `makemigrations & migrate`, kita juga mensetting di beberapa bagian guna penampilan `slug_field` tersebut.\\r\\n\\r\\nNah, pada akhirnya, kami putuskan untuk mengambil salah satu function berupa `get_absolute_url(self):` yang merupakan turunan dari class yang telah kita buat di `blog/models.py`, misalkan seperti ini:\\r\\n\\r\\n```\\r\\n>>> from blog.models import Entry\\r\\n>>> dir(Entry)\\r\\n['DoesNotExist', ..... , 'get_absolute_url', 'get_deferred_fields', 'get_next_by_created', 'get_next_by_modified', 'get_previous_by_created', ...... ]\\r\\n>>>\\r\\n>>>\\r\\n```\\r\\n\\r\\n**Lalu URL apa yang kita gunakan?**\\r\\n\\r\\nKita memanfaatkan `pk` [ primary key ] atau `id` dari Author. yang endingnya digunakan sebagai opsi pengganti dari `slug_field`. Dan jika diterapkan menjadi seperti ini: `python.web.id/author/<pk>` [ `pk` berupa number ].\\r\\n\\r\\n**Kemudian mana yang kita rubah dan tambah?**\\r\\n\\r\\nUntuk perubahan setidaknya ada 6 perubahan, dan 1 penambahan template berupa `all_tags.html`.\\r\\n\\r\\n**1.** Penambahan function berupa `get_absolute_url(self):` pada `class Author` di `blog/models.py`, ini digunakan untuk pengambilan `<pk>` sebagai absolute url, bisa dilihat disini perubahannya: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/55e9792baff6039f9292773432ea29122c252b89](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/55e9792baff6039f9292773432ea29122c252b89)\\r\\n\\r\\n**2.** Penambahan function baru berupa `displayArticleUnderAuthor(request, pk):` pada `myproject/views.py`. bisa dilihat disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7bc87c58ca02e4c332a91c90399f95816af50245](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/7bc87c58ca02e4c332a91c90399f95816af50245)\\r\\n\\r\\n**3.** Penambahan url baru pada `myproject/urls.py` untuk memanggil functionnya di urls, dan itu bisa dilihat disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/652c7b174c6963ee8602f25be0c38e81eafe1612](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/652c7b174c6963ee8602f25be0c38e81eafe1612)\\r\\n\\r\\n**4.** Membuat [ template ] baru berupa `post_author.html` pada directory `templates/post_author.html`, ini digunakan sebagai template untuk menampilkan post under author, bisa dilihat disini scriptnya: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/16bffdf2c04fce04960fb3ae2f02e55c8861c21d](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/16bffdf2c04fce04960fb3ae2f02e55c8861c21d)\\r\\n\\r\\n**5.** Perubahan pada template `home.html` yaitu yang awalnya `{{ object.author }}` menjadi `<a href=\\\"/author/{{ object.author.pk }}\\\">{{ object.author }}</a>`, ini dilakukan agar author menjadi link yang menuju ke author url. Untuk perubahannya bisa dilihat disini detailnya: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/56a1363250c1866c3244c2c6dcdc590e38ae6114](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/56a1363250c1866c3244c2c6dcdc590e38ae6114)\\r\\n\\r\\n**6.** Sama halnya seperti pada perubahan yang ke-5, yaitu hanya perubahan sedikit pada `author`, kali ini untuk template `post.html`, kemarin kan kita update mengenai display author di post, nah ini pada bagian `<a href=\\\"{{ entry.author.website }}\\\">` diganti menjadi `<a href=\\\"{{ object.author.pk }}\\\">`, tujuannya ketika di click avatar/foto'nya akan menuju ke post under author. Selengkapnya bisa dilihat disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/e19f09d8cc754dc6cc696621078b97cb22a8f182](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/e19f09d8cc754dc6cc696621078b97cb22a8f182)\\r\\n\\r\\n**7.** Sama lagi, hanya perubahan sedikit pada `author` di template `result.html`, yang awalnya hanya `{{ objcet.author }}` dirubah menjadi `<a href=\\\"/author/{{ object.author.pk }}\\\">{{ object.author }}</a>`, lihat selengkapnya disini: [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/da407579964867d65c94a877d24ef89dc5e054d3](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commit/da407579964867d65c94a877d24ef89dc5e054d3)\\r\\n\\r\\nBisa dilihat juga pada Commits on Sep 17, 2015 untuk melihat commits pada tanggal tersebut. [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commits/master](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/commits/master)\\r\\n\\r\\nJika ada terjadi problem, bisa ditanyakan melalui comment dibawah ini, atau melalui report issues di [https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/issues](https://github.com/agusmakmun/Django-Blog-Python-Learning-v.2/issues \\\"Report Issues\\\")\\r\\n\\r\\nSemoga bermanfaat.\",\n            \"keywords\": \"[ update display post under author ] Django Blog Python Learning v.2, display post under author, display post under author django, post under author, django post author\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 69,\n            \"absolute_url\": \"/posts/detail/how-to-setup-postgresql-database-in-django/\",\n            \"created_at\": \"2020-10-10T10:42:40.396940\",\n            \"updated_at\": \"2020-10-10T10:42:40.402831\",\n            \"title\": \"How to setup PostgreSQL Database in Django\",\n            \"slug\": \"how-to-setup-postgresql-database-in-django\",\n            \"description\": \"How to setup PostgreSQL Database in Django, this night I wanna share simple tutorial how to setup PostgreSQL Database in Django. This problem has been asked and solved with user from [http://stackoverflow.com/a/5421511](http://stackoverflow.com/a/5421511)\\r\\n\\r\\n### Installation\\r\\n\\r\\nDownload [http://initd.org/psycopg/](http://initd.org/psycopg/ \\\"download psycopg\\\"), then install it under django & python PATH.\\r\\n\\r\\nAfter downloading, easily extract the tarball and:\\r\\n\\r\\n```\\r\\n$ python setup.py install\\r\\n```\\r\\n\\r\\n\\r\\nOr if you wish, at [command-line|console] install it by either easy_install or pip. _(I prefer to use pip over easy_install for no reason.)_\\r\\n\\r\\n```\\r\\n$ easy_install psycopg2\\r\\n```\\r\\n\\r\\nOr this:\\r\\n\\r\\n\\r\\n```\\r\\n$ pip install psycopg2\\r\\n```\\r\\n\\r\\n### Configuration\\r\\n\\r\\nin your `settings.py`, change default database `sqlite3` to this configuration.\\r\\n\\r\\n```\\r\\nDATABASES = {\\r\\n    'default': {\\r\\n        'ENGINE': 'django.db.backends.postgresql_psycopg2',\\r\\n        'NAME': 'db_name',                      \\r\\n        'USER': 'db_user',\\r\\n        'PASSWORD': 'db_user_password',\\r\\n        'HOST': '',\\r\\n        'PORT': 'db_port_number',\\r\\n    }\\r\\n}\\r\\n```\\r\\n\\r\\nHopefully can help..\",\n            \"keywords\": \"How to setup PostgreSQL Database in Django, setup PostgreSQL Database, PostgreSQL Django, Setup PostgreSQL\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 17,\n                    \"name\": \"database\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 61,\n            \"absolute_url\": \"/posts/detail/create-a-simple-django-app/\",\n            \"created_at\": \"2020-10-10T10:42:40.284422\",\n            \"updated_at\": \"2020-10-10T10:42:40.292626\",\n            \"title\": \"Create a simple Django app\",\n            \"slug\": \"create-a-simple-django-app\",\n            \"description\": \"Create a simple Django app. Assalamu'alaikum, this afternoon i wanna share a simple project of django app. Usefull for someone that will make simple django app.\\r\\n\\r\\nFor this repository, you can check at this [https://github.com/agusmakmun/simpleDjango](https://github.com/agusmakmun/simpleDjango)\\r\\n\\r\\nBut before use, we recomended to you use **virtualenv** _(virtual environtment)_ for python. for example on your terminal to create virtualenv:\\r\\n\\r\\n```\\r\\n$ virtualenv simpledjango\\r\\n$ cd simpledjango\\r\\n$ source bin/activate\\r\\n$ (simpledjango)user@user:~ pip install Django\\r\\n```\\r\\n\\r\\n\\r\\n**[ Installation ] Now clone our project to use:**\\r\\n\\r\\n\\r\\n```\\r\\n$ (simpledjango)user@user:~ git clone git@github.com:agusmakmun/simpleDjango.git\\r\\n$ (simpledjango)user@user:~ cd simpleDjango\\r\\n$ (simpledjango)user@user:~/simpledjango$ ./manage.py runserver\\r\\n```\\r\\n\\r\\n\\r\\nThen, checkout on your browser [http://127.0.0.1:8000/](http://127.0.0.1:8000/), and [http://127.0.0.1:8000/admin/](http://127.0.0.1:8000/admin/) to see default admin.  \\r\\nTo login as administrator, `username: agaust` and `password: 1`\\r\\n\\r\\n### Screenshot Homepage\\r\\n\\r\\n![simpleDjango](https://python.web.id/media/gallery/screenshot.png \\\"simpleDjango\\\")\\r\\n\\r\\n### Screenshot Basic Admin\\r\\n\\r\\n![simpleDjango admin](https://python.web.id/media/gallery/adminface.png \\\"simpleDjango admin\\\")\",\n            \"keywords\": \"Create a simple Django app, simple django, simple django app, django app, django, app django, simpleDjango\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 4,\n                    \"name\": \"beginner\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 60,\n            \"absolute_url\": \"/posts/detail/how-to-make-thumbnail-in-django-with-pillow/\",\n            \"created_at\": \"2020-10-10T10:42:40.265960\",\n            \"updated_at\": \"2020-10-10T10:42:40.276009\",\n            \"title\": \"How to Make Thumbnail in Django with Pillow\",\n            \"slug\": \"how-to-make-thumbnail-in-django-with-pillow\",\n            \"description\": \"How to Make Thumbnail in Django with Pillow, Hello there, this night i wanna share simply tutorial how to Make Thumbnail image in Django with Pillow.\\r\\n\\r\\nThis example from my last project:\\r\\n\\r\\n\\r\\n```\\r\\nclass Buku(models.Model):\\r\\n\\tjudul = models.CharField(max_length=200)\\r\\n\\tslug = models.SlugField(max_length=200, unique=True)\\r\\n\\tcover = models.ImageField(upload_to='covers', null=True, blank=True)\\r\\n\\tthumbnail = models.ImageField(upload_to='covers/thumbnail', editable=False)\\r\\n\\r\\n\\tdef save(self, *args, **kwargs):\\r\\n\\t\\tsuper(Buku, self).save(*args, **kwargs)\\r\\n\\t\\tif not self.make_thumbnail():\\r\\n\\t\\t\\traise Exception('Could not create thumbnail - is the file type valid?')\\r\\n\\r\\n\\tdef make_thumbnail(self):\\r\\n\\t\\tfrom cStringIO import StringIO\\r\\n\\t\\timport os\\r\\n\\t\\tfrom django.db import models\\r\\n\\t\\tfrom django.core.files.base import ContentFile\\r\\n\\t\\tfrom django.core.files.storage import default_storage as storage\\r\\n\\t\\tfrom PIL import Image\\r\\n\\t\\t\\r\\n\\t\\tTHUMB_SIZE = (110, 150)\\r\\n\\r\\n\\t\\tfh = storage.open(self.cover.name, 'r')\\r\\n\\t\\ttry:\\r\\n\\t\\t\\timage = Image.open(fh)\\r\\n\\t\\texcept:\\r\\n\\t\\t\\treturn False\\r\\n\\t\\t\\r\\n\\t\\timage.thumbnail(THUMB_SIZE, Image.ANTIALIAS)\\r\\n\\t\\tfh.close()\\r\\n\\t\\t\\r\\n\\t\\tthumb_name, thumb_extension = os.path.splitext(self.cover.name)\\r\\n\\t\\tthumb_extension = thumb_extension.lower()\\r\\n\\t\\tthumb_filename = thumb_name + '_thumb' + thumb_extension\\r\\n\\r\\n\\t\\tif thumb_extension in ['.jpg', '.jpeg']:\\r\\n\\t\\t\\tFTYPE = 'JPEG'\\r\\n\\t\\telif thumb_extension == '.gif':\\r\\n\\t\\t\\tFTYPE = 'GIF'\\r\\n\\t\\telif thumb_extension == '.png':\\r\\n\\t\\t\\tFTYPE = 'PNG'\\r\\n\\t\\telse:\\r\\n\\t\\t\\treturn False\\r\\n\\r\\n\\t\\ttemp_thumb = StringIO()\\r\\n\\t\\timage.save(temp_thumb, FTYPE)\\r\\n\\t\\ttemp_thumb.seek(0)\\r\\n\\t\\tself.thumbnail.save(thumb_filename, ContentFile(temp_thumb.read()), save=False)\\r\\n\\t\\ttemp_thumb.close()\\r\\n\\r\\n\\t\\treturn True\\r\\n\\r\\n\\r\\n\\\"\\\"\\\"\\r\\nProblem: \\r\\nmaximum recursion depth exceeded while calling a Python object.\\r\\n>>> With: http://stackoverflow.com/a/23927211/3445802\\r\\n\\r\\nSolved:\\r\\n>>> self.thumbnail.save(thumb_filename, ContentFile(temp_thumb.read()), save=True)\\r\\nTO:\\r\\n>>> self.thumbnail.save(thumb_filename, ContentFile(temp_thumb.read()), save=False)\\r\\n\\\"\\\"\\\"\\r\\n```\",\n            \"keywords\": \"pillow, django, django thumbnail, make a thumbnail in django\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 59,\n            \"absolute_url\": \"/posts/detail/simple-sending-email-with-html-type-in-django/\",\n            \"created_at\": \"2020-10-10T10:42:40.248724\",\n            \"updated_at\": \"2020-10-10T10:42:40.255256\",\n            \"title\": \"Simple Sending Email with HTML type in Django\",\n            \"slug\": \"simple-sending-email-with-html-type-in-django\",\n            \"description\": \"Simple Sending Email HTML in Django, Django have a module for email, one of them is `EmailMessage`, and in the class of `EmailMessage` have a function `content_subtype`, so, u can change it with what your type do u want, like `plain` text, or `html`. Default from django is plain text. Let's checkout it:\\r\\n\\r\\n```\\r\\n>>> from django.core.mail import EmailMessage\\r\\n>>> dir(EmailMessage.content_subtype)\\r\\n['__add__', '__class__', '__contains__', '__delattr__', '__doc__' ,...., 'swapcase', 'title', 'translate', 'upper', 'zfill']\\r\\n>>> \\r\\n>>> msg = EmailMessage.content_subtype\\r\\n>>> msg\\r\\n'plain'\\r\\n>>> msg = EmailMessage.content_subtype = \\\"html\\\"\\r\\n>>> msg\\r\\n'html'\\r\\n>>> \\r\\n```\\r\\n\\r\\n\\r\\nAwesome right? ![laugh](https://python.web.id/static/ckeditor/ckeditor/plugins/smiley/images/teeth_smile.png \\\"laugh\\\")   \\r\\nNow, how i can use it?\\r\\n\\r\\n\\r\\n```\\r\\nfrom django.core.mail import EmailMessage\\r\\nsubject = \\\"This is subject\\\"\\r\\nmessage = \\\"<html><head></head><body>This is body message</body></html>\\\"\\r\\n\\r\\ndef send_email(to_list, subject, message, sender=\\\"Aircourts <noreply@aircourts.com>\\\"):\\r\\n    msg = EmailMessage(subject, message, sender, to_list)\\r\\n    msg.content_subtype = \\\"html\\\"  # Main content is now text/html\\r\\n    return msg.send() #replace 'return' if you use like a form or something else.\\r\\n```\\r\\n\\r\\n\\r\\nRef: http://masnun.com/2014/01/09/django-sending-html-only-email.html\",\n            \"keywords\": \"email, email html type, Simple Sending Email with HTML type in Django, Email with HTML type in Django\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 58,\n            \"absolute_url\": \"/posts/detail/pyjne-is-a-tool-to-simplify-the-user-in-using-the-api-jne-such-as-tracking-stuff-check-tariffs-and-others/\",\n            \"created_at\": \"2020-10-10T10:42:40.231430\",\n            \"updated_at\": \"2020-10-10T10:42:40.239540\",\n            \"title\": \"PyJNE is a tool to simplify the user in using the API JNE such as tracking stuff, check tariffs and others.\",\n            \"slug\": \"pyjne-is-a-tool-to-simplify-the-user-in-using-the-api-jne-such-as-tracking-stuff-check-tariffs-and-others\",\n            \"description\": \"PyJNE is a tool to simplify the user in using the API JNE such as tracking stuff, check tariffs and others. This repository from kangfend is usefull if you use API JNE for your project.\\r\\n\\r\\nMakesure you ask permission first to the JNE Company before use its API.\\r\\n\\r\\n  \\r\\nThere you can see what destinations that will you tracking with price from JNE.\\r\\n\\r\\nSuch as what _**freature**_ was added:\\r\\n\\r\\n*   Get origin city code\\r\\n*   Get destination city code\\r\\n*   Check JNE tariffs\\r\\n*   Tracking stuff\\r\\n*   Find Nearby\\r\\n\\r\\nAnd this simply how to get origin city code:\\r\\n\\r\\n\\r\\n```\\r\\n>>> from jne import Jne\\r\\n>>> jne = Jne(api_key='d4dedbecf40d6d09f22704342c0', username='MYUSERNAME')\\r\\n>>> jne.get_from_code('jakarta')\\r\\n{u'detail': [{u'code': u'CGK10000', u'label': u'JAKARTA'}]}\\r\\n>>>\\r\\n>>> # Show result with pretty print\\r\\n>>> jne.get_from_code('jakarta', pretty_print=True)   \\r\\n{                                                     \\r\\n  \\\"detail\\\": [                                         \\r\\n    {                                                 \\r\\n      \\\"code\\\": \\\"CGK10000\\\",                             \\r\\n      \\\"label\\\": \\\"JAKARTA\\\"                              \\r\\n    }                                                 \\r\\n  ]                                                   \\r\\n}                                                     \\r\\n>>>\\r\\n```\\r\\n\\r\\nAnd this simply how to check price with jne api:\\r\\n\\r\\n\\r\\n```\\r\\n>>> jne.check_tariff(city_from='CGK10000', city_to='CBN10000', weight=1)\\r\\n{u'price': [{u'service_code': u'OKE13', u'etd_from': u'2', u'price': u'9000', u'origin_name': u'JAKARTA', u'times': u'D', u'service_display': u'OKE', u'etd_thru': u'3', u'destination_name': u'CIREBON'}, {u'service_code': u'REG13', u'etd_from': u'1', u'price': u'10000', u'origin_name': u'JAKARTA', u'times': u'D', u'service_display': u'REG', u'etd_thru': u'2', u'destination_name': u'CIREBON'}, {u'service_code': u'SPS13', u'etd_from': None, u'price': u'350000', u'origin_name': u'JAKARTA', u'times': None, u'service_display': u'SPS', u'etd_thru': None, u'destination_name': u'CIREBON'}, {u'service_code': u'YES13', u'etd_from': u'1', u'price': u'19000', u'origin_name': u'JAKARTA', u'times': u'D', u'service_display': u'YES', u'etd_thru': None, u'destination_name': u'CIREBON'}]}\\r\\n>>>\\r\\n>>>\\r\\n>>> # Show result with pretty print\\r\\n>>> jne.check_tariff(city_from='CGK10000', city_to='CBN10000', weight=1, pretty_print=True)\\r\\n{\\r\\n  \\\"price\\\": [\\r\\n    {\\r\\n      \\\"destination_name\\\": \\\"CIREBON\\\",\\r\\n      \\\"etd_from\\\": \\\"2\\\",\\r\\n      \\\"etd_thru\\\": \\\"3\\\",\\r\\n      \\\"origin_name\\\": \\\"JAKARTA\\\",\\r\\n      \\\"price\\\": \\\"9000\\\",\\r\\n      \\\"service_code\\\": \\\"OKE13\\\",\\r\\n      \\\"service_display\\\": \\\"OKE\\\",\\r\\n      \\\"times\\\": \\\"D\\\"\\r\\n    },\\r\\n    {\\r\\n      \\\"destination_name\\\": \\\"CIREBON\\\",\\r\\n      \\\"etd_from\\\": \\\"1\\\",\\r\\n      \\\"etd_thru\\\": \\\"2\\\",\\r\\n      \\\"origin_name\\\": \\\"JAKARTA\\\",\\r\\n      \\\"price\\\": \\\"10000\\\",\\r\\n      \\\"service_code\\\": \\\"REG13\\\",\\r\\n      \\\"service_display\\\": \\\"REG\\\",\\r\\n      \\\"times\\\": \\\"D\\\"\\r\\n    },\\r\\n    {\\r\\n      \\\"destination_name\\\": \\\"CIREBON\\\",\\r\\n      \\\"etd_from\\\": null,\\r\\n      \\\"etd_thru\\\": null,\\r\\n      \\\"origin_name\\\": \\\"JAKARTA\\\",\\r\\n      \\\"price\\\": \\\"350000\\\",\\r\\n      \\\"service_code\\\": \\\"SPS13\\\",\\r\\n      \\\"service_display\\\": \\\"SPS\\\",\\r\\n      \\\"times\\\": null\\r\\n    },\\r\\n    {\\r\\n      \\\"destination_name\\\": \\\"CIREBON\\\",\\r\\n      \\\"etd_from\\\": \\\"1\\\",\\r\\n      \\\"etd_thru\\\": null,\\r\\n      \\\"origin_name\\\": \\\"JAKARTA\\\",\\r\\n      \\\"price\\\": \\\"19000\\\",\\r\\n      \\\"service_code\\\": \\\"YES13\\\",\\r\\n      \\\"service_display\\\": \\\"YES\\\",\\r\\n      \\\"times\\\": \\\"D\\\"\\r\\n    }\\r\\n  ]\\r\\n}\\r\\n>>> \\r\\n```\\r\\n\\r\\n\\r\\nFor more information you can checkout on this repository [https://github.com/kangfend/py-jne](https://github.com/kangfend/py-jne)  \\r\\nHelpfull can help.\",\n            \"keywords\": \"py jne, api jne, python jne tracking, jne tracking, py-jne, tarif jne\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 57,\n            \"absolute_url\": \"/posts/detail/django-how-to-include-templates-from-another-app/\",\n            \"created_at\": \"2020-10-10T10:42:40.216059\",\n            \"updated_at\": \"2020-10-10T10:42:40.222718\",\n            \"title\": \"Django: How to Include Templates from another APP\",\n            \"slug\": \"django-how-to-include-templates-from-another-app\",\n            \"description\": \"Django is awesome, was designed with folder of `templates` to find all templates was include in your app. If you work with multiple app in your project, you just create a folder `templates` in your project or app. Django will find at all, even though with different app.\\r\\n\\r\\nThis tutorial was asked on stackoverflow, and was [answer with Carles Barrobés](http://stackoverflow.com/a/4571777/3445802). This answer of it:\\r\\n\\r\\nAs long as the apps are in `INSTALLED_APPS` and the template loader for apps dirs is enabled, you can include any template from another app, i.e.:\\r\\n\\r\\n```\\r\\n{% include \\\"header.html\\\" %}\\r\\n```\\r\\n\\r\\n... since your templates are located directly in the templates dir of your app. Generally, in order to avoid name clashes it is better to use:\\r\\n\\r\\n```\\r\\napp1/\\r\\n    templates/\\r\\n        app1/\\r\\n            page1.html\\r\\n            page2.html\\r\\napp2/\\r\\n    templates/\\r\\n        app2/\\r\\n            page1.html\\r\\n            page2.html\\r\\n```\\r\\n\\r\\n\\r\\nAnd `{% include \\\"app1/page1.html\\\" %}` or `{% include \\\"app2/page1.html\\\" %}` ...\\r\\n\\r\\nBut: for keeping a consistent look and feel, it is so much better to use template inheritance rather than inclusion. Template inheritance is one of the **really good things** of the Django template system, choose inheritance over inclusion whenever it makes sense (most of the time).\\r\\n\\r\\nMy recommendations:\\r\\n\\r\\n*   Have a base template for your project (\\\"base.html\\\" is the default convention) with header and footer and a `{%block content%}` for your main content.\\r\\n*   Have your other templates inherit form base.html `{% extends \\\"base.html\\\" %}` and override the content section\\r\\n\\r\\nSee another response to this question for links to the doc.\\r\\n\\r\\nRefference: [http://stackoverflow.com/questions/4571686/django-include-template-from-another-app](http://stackoverflow.com/questions/4571686/django-include-template-from-another-app)\",\n            \"keywords\": \"Django: How to Include Templates from another APP, How to Include Templates from another APP, django Include Templates, django, django templates, django app, how to include templates django\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 19,\n                    \"name\": \"templates\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 56,\n            \"absolute_url\": \"/posts/detail/django-installing-django-ckeditor/\",\n            \"created_at\": \"2020-10-10T10:42:40.199864\",\n            \"updated_at\": \"2020-10-10T10:42:40.206408\",\n            \"title\": \"Django: Installing Django Ckeditor\",\n            \"slug\": \"django-installing-django-ckeditor\",\n            \"description\": \"Django: Installing Django Ckeditor, Ckeditor is awesome editor and most popular editor was used for website, and compatible with django.\\r\\n\\r\\n**1.** Install or add django-ckeditor to your python path.\\r\\n\\r\\n```\\r\\n$ pip install django-ckeditor\\r\\n```\\r\\n\\r\\n\\r\\n**2.** Add `ckeditor` and `ckeditor_uploader` to your `INSTALLED_APPS` setting.\\r\\n\\r\\n**3. django-ckeditor uses jQuery in ckeditor-init.js file. You must set ``CKEDITOR_JQUERY_URL`` to a jQuery URL that will be used to load the library**. If you have jQuery loaded from a different source just don't set [CKEDITOR_JQUERY_URL] and django-ckeditor will not try to load its own jQuery. If you find that CKEditor widgets don't appear in your Django admin site then check that this variable is set correctly. Example:\\r\\n\\r\\n\\r\\n```\\r\\nCKEDITOR_JQUERY_URL = '//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'\\r\\n```\\r\\n\\r\\n\\r\\n**4.** Run the collectstatic management command: `$ ./manage.py collectstatic`. This will copy static CKEditor required media resources into the directory given by the `STATIC_ROOT` setting. [See Django's documentation on managing static files for more info](https://docs.djangoproject.com/en/dev/howto/static-files).\\r\\n\\r\\nFor more installation you can checkout on this repository: [https://github.com/django-ckeditor/django-ckeditor#installation](https://github.com/django-ckeditor/django-ckeditor#installation)\\r\\n\\r\\nAnd in this post we want to show you how to setting `` `Choose File` `` for your image like this picture:\\r\\n\\r\\n![Django Ckeditor Upload Image](https://python.web.id/media/gallery/django_ckeditor_upload_image.png \\\"Django Ckeditor Upload Image\\\")\\r\\n\\r\\nDefault setting from ckeditor uses `RichTextField`, so like what was notice says: \\\"Django admin CKEditor integration. Provides a `RichTextField, RichTextUploadingField, CKEditorWidget` and `CKEditorUploadingWidget` utilizing CKEditor with image upload and browsing support included.\\\"\\r\\n\\r\\nin your **models.py **change `RichTextField()` to `RichTextUploadingField()`\\r\\n\\r\\n\\r\\n```\\r\\nfrom ckeditor_uploader.fields import RichTextUploadingField\\r\\n\\r\\nclass Entry(models.Model):\\r\\n    title = models.CharField(max_length=200)\\r\\n    slug = models.SlugField(max_length=200, unique=True)\\r\\n    images = models.ImageField(upload_to='blog/images/%Y/%m/%d', blank=True)\\r\\n    tags = models.ManyToManyField('Tag')\\r\\n    body = RichTextUploadingField() #RichTextField()\\r\\n```\\r\\n\\r\\n\\r\\nHelpfull can help.  \\r\\nThanks for _**Lukman Namkul**_ for solved this problem.\",\n            \"keywords\": \"django ckeditor, ckeditor, django ckeditor upload image, django ckeditor browse image\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 12,\n                    \"name\": \"app\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        },\n        {\n            \"id\": 55,\n            \"absolute_url\": \"/posts/detail/django-builtin-filter-simple/\",\n            \"created_at\": \"2020-10-10T10:42:40.183063\",\n            \"updated_at\": \"2020-10-10T10:42:40.190925\",\n            \"title\": \"Django: Builtin Filter Simple\",\n            \"slug\": \"django-builtin-filter-simple\",\n            \"description\": \"Django Builtin Filter for Simple, this tutorial just showing simply how to use django builtin filter for example blog.\\r\\n\\r\\n* `safe` for translate to html views\\r\\n* `truncatewords` to truncate by words\\r\\n* `striptags` for removing script tags, like html or javascript.\\r\\n* `removetags` for removing tags by filter for html only\\r\\n\\r\\nExample Input:\\r\\n--------------\\r\\n\\r\\n```\\r\\n<b>Deskripsi Sample Blog Item 2.</b><br /><h3>Teknik Tree</h3> yang kami maksudkan disini adalah teknik untuk mencari \\r\\nsebuah website yang berkaitan dengan website yang saat ini anda temukan.\\r\\n```\\r\\n\\r\\n\\r\\n1. Sample Method 1\\r\\n-------------------\\r\\n\\r\\n\\r\\n```\\r\\n{{ object.body|safe|truncatewords:\\\"10\\\" }}\\r\\n```\\r\\n\\r\\n\\r\\n**`The output is:`**  \\r\\n**Deskripsi Sample Blog Item 2.**\\r\\n\\r\\n### Teknik Tree\\r\\n\\r\\nyang kami maksudkan disini adalah ...\\r\\n\\r\\n2. Sample Method 2\\r\\n-------------------\\r\\n\\r\\n{{ object.body|safe|striptags|truncatewords:\\\"10\\\" }}\\r\\n\\r\\n**`The output is:`**  \\r\\n\\r\\nDeskripsi Sample Blog Item 2. Teknik Tree yang kami maksudkan disini adalah ...\\r\\n\\r\\n_**Refference:**_\\r\\n\\r\\n*   [https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#striptags](https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#striptags)\\r\\n*   [https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#removetags](https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#removetags) (*custom filter tags)\",\n            \"keywords\": \"Django Builtin Filter Simple, Django Builtin, Builtin Filter, Builtin Filter django, django filter tags, filter html django\",\n            \"meta_description\": \"\",\n            \"is_featured\": false,\n            \"rating_likes\": 0,\n            \"rating_dislikes\": 0,\n            \"author\": \"agaust\",\n            \"tags\": [\n                {\n                    \"id\": 26,\n                    \"name\": \"python\",\n                    \"description\": \"\"\n                },\n                {\n                    \"id\": 11,\n                    \"name\": \"django\",\n                    \"description\": \"\"\n                }\n            ]\n        }\n    ]\n}"}],"_postman_id":"79863d68-4560-4aea-9ea5-c533ef8bccde"},{"name":"Post Detail","id":"50aaa2f4-b1ef-4ca6-b450-253e5f9827f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":"{{url}}/api/v1/post/?id=1","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n</ul>\n<hr />\n<ul>\n<li>param <code>id</code> is integer id of <strong>Post</strong> <em>(required)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","post",""],"host":["{{url}}"],"query":[{"key":"id","value":"1"}],"variable":[]}},"response":[{"id":"010d88e5-0158-4bb6-9b3e-8032a9d1d8b5","name":"Success","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/post/?id=1","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"id","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 09:20:16 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"3895"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 200,\n    \"result\": {\n        \"id\": 1,\n        \"absolute_url\": \"/posts/detail/command-to-handle-deploy-django-with-quickly/\",\n        \"created_at\": \"2020-10-10T10:42:39.357182\",\n        \"updated_at\": \"2020-10-10T10:42:39.365242\",\n        \"title\": \"Command to handle deploy Django with quickly\",\n        \"slug\": \"command-to-handle-deploy-django-with-quickly\",\n        \"description\": \"Hello guys, this morning i want to share simply how to custom command to handle deploy Django with quickly.\\r\\n\\r\\n- `./manage.py deploy --yes <username> <password> <email>`\\r\\n\\r\\n- `./manage.py deploy --yes --username=myusername --password=mypassword`\\r\\n\\r\\nLet see, the **_`email`_** has default empty string, so you can fill with your email or just passed it.\\r\\n\\r\\nFor example, i need custom my command to can do database migrations and create the superuser.\\r\\n\\r\\nInside file of: `yourapp/management/commands/deploy.py`\\r\\n\\r\\n```python\\r\\nfrom django.db.utils import IntegrityError\\r\\nfrom django.contrib.auth.models import User\\r\\nfrom django.core.management import call_command\\r\\nfrom django.core.management.base import (BaseCommand, CommandError)\\r\\n\\r\\n\\r\\nclass Command(BaseCommand):\\r\\n    help = 'Command to handle deploy django with quickly!'\\r\\n\\r\\n    def add_arguments(self, parser):\\r\\n        parser.add_argument(\\r\\n            '--yes',\\r\\n            action='store_true',\\r\\n            help='Activate deploy command action.'\\r\\n        )\\r\\n        parser.add_argument(\\r\\n            '--username',\\r\\n            help='Username for superuser.'\\r\\n        )\\r\\n        parser.add_argument(\\r\\n            '--password',\\r\\n            help='Password for superuser.'\\r\\n        )\\r\\n        parser.add_argument(\\r\\n            '--email', default='',\\r\\n            help='Optional email address for superuser.'\\r\\n        )\\r\\n\\r\\n    def handle(self, *args, **options):\\r\\n        \\\"\\\"\\\"\\r\\n        Command to handle all arguments.\\r\\n        You can do stuff here...\\r\\n        \\\"\\\"\\\"\\r\\n        if options['yes'] and options['username'] and options['password']:\\r\\n            # Do database migrations.\\r\\n            call_command('migrate')\\r\\n            call_command('makemigrations')\\r\\n            call_command('migrate')\\r\\n\\r\\n            # Creating the superuser\\r\\n            try:\\r\\n                superuser = User.objects.create(\\r\\n                    username=options['username'],\\r\\n                    password=options['password'],\\r\\n                    email=options['email'],\\r\\n                    is_superuser=True,\\r\\n                    is_staff=True\\r\\n                )\\r\\n                superuser.save()\\r\\n                self.stdout.write(\\r\\n                    self.style.SUCCESS(\\r\\n                        \\\"Superuser as `{}` successfully created!\\\".format(\\r\\n                            options['username']\\r\\n                        )\\r\\n                    )\\r\\n                )\\r\\n            except IntegrityError:\\r\\n                raise CommandError('The user as `{}` already exist!'.format(\\r\\n                    options['username']\\r\\n                ))\\r\\n            except Exception as e:\\r\\n                raise CommandError(e)\\r\\n        else:\\r\\n            return self.print_help('deploy', '-h')\\r\\n```\\r\\n\\r\\nScript above is just an example. you also can custom it with what your needs.\\r\\n\\r\\n_**See also:**_ [https://docs.djangoproject.com/en/dev/howto/custom-management-commands/](https://docs.djangoproject.com/en/dev/howto/custom-management-commands/)\",\n        \"keywords\": null,\n        \"meta_description\": \"\",\n        \"is_featured\": false,\n        \"rating_likes\": 0,\n        \"rating_dislikes\": 0,\n        \"author\": \"agaust\",\n        \"tags\": [\n            {\n                \"id\": 30,\n                \"name\": \"server\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 27,\n                \"name\": \"solution\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 26,\n                \"name\": \"python\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 11,\n                \"name\": \"django\",\n                \"description\": \"\"\n            },\n            {\n                \"id\": 10,\n                \"name\": \"tricks\",\n                \"description\": \"\"\n            }\n        ]\n    },\n    \"message\": \"Success\",\n    \"success\": true\n}"},{"id":"82752e7d-d00e-475c-b12a-68fd71595939","name":"Error - Invalid Token","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token xxxxx"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/post/?id=1","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"id","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:38:26 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"},{"id":"eb2abead-cad2-4841-a253-f62f0f3c012e","name":"Error - Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Accept-Language","type":"text","value":"en"}],"url":{"raw":"{{url}}/api/v1/post/?id=99999","host":["{{url}}"],"path":["api","v1","post",""],"query":[{"key":"id","value":"99999"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:38:40 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"72"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 404,\n    \"result\": {},\n    \"message\": \"Not found.\",\n    \"success\": false\n}"}],"_postman_id":"50aaa2f4-b1ef-4ca6-b450-253e5f9827f0"},{"name":"Post Delete","id":"d1caf5b9-ec42-4f2d-82f1-13ac1645622b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/","description":"<ul>\n<li><code>Authorization: Token {{auth_token}}</code> is header token authentication.</li>\n<li><code>Accept-Language</code> is header to enable the translation, the value of this header coming from <strong>Languages</strong>, eg: <code>id</code> or <code>en</code>.</li>\n<li><code>Response-Format</code> is header to response format mode, please fill <code>\"application/json\"</code>.</li>\n<li><code>Content-Type</code> is content type data, please fill <code>application/json</code>.</li>\n</ul>\n<hr />\n<ul>\n<li>body <code>id</code> is integer id of <strong>Post</strong> <em>(required)</em>.</li>\n</ul>\n","urlObject":{"path":["api","v1","post",""],"host":["{{url}}"],"query":[],"variable":[]}},"response":[{"id":"627248e4-faa6-47ea-ba11-f85fb0a2c266","name":"Success","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:07:19 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"87"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 200,\n    \"message\": \"Post successfully deleted!\",\n    \"result\": {},\n    \"success\": true\n}"},{"id":"b7611ff0-5f1e-4221-a7dd-e046122adad7","name":"Error - Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","type":"text","value":"Token {{auth_token}}"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 99999\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:39:34 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"72"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 404,\n    \"result\": {},\n    \"message\": \"Not found.\",\n    \"success\": false\n}"},{"id":"fb76166d-951b-4cec-a18e-0d26f3434580","name":"Error - Invalid Token","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","type":"text","value":"Token xxxxx"},{"key":"Accept-Language","type":"text","value":"en"},{"key":"Response-Format","type":"text","value":"application/json"},{"key":"Content-Type","type":"text","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/v1/post/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Sat, 10 Oct 2020 12:39:17 GMT"},{"key":"Server","value":"WSGIServer/0.2 CPython/3.8.2"},{"key":"Content-Type","value":"application/json"},{"key":"WWW-Authenticate","value":"Token"},{"key":"Allow","value":"GET, POST, PUT, DELETE, HEAD, OPTIONS"},{"key":"Vary","value":"Accept-Language, Origin"},{"key":"Content-Language","value":"en"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"76"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": 401,\n    \"result\": {},\n    \"message\": \"Invalid token.\",\n    \"success\": false\n}"}],"_postman_id":"d1caf5b9-ec42-4f2d-82f1-13ac1645622b"}],"event":[{"listen":"prerequest","script":{"id":"e5ebe518-6a5a-445f-b706-b8ee6b4d6aa4","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"06a00d92-0b79-4459-a822-26829d353fa0","type":"text/javascript","exec":[""]}}]}