{"id":39509077,"url":"https://github.com/codingforentrepreneurs/tweetme-2","last_synced_at":"2026-01-18T06:00:47.462Z","repository":{"id":36505725,"uuid":"227947636","full_name":"codingforentrepreneurs/Tweetme-2","owner":"codingforentrepreneurs","description":"Build a twitter-like app in Django, Bootstrap, Javascript, \u0026 React.js. Step-by-Step.","archived":false,"fork":false,"pushed_at":"2023-01-05T13:48:06.000Z","size":2315,"stargazers_count":402,"open_issues_count":28,"forks_count":218,"subscribers_count":23,"default_branch":"master","last_synced_at":"2024-03-15T19:58:03.341Z","etag":null,"topics":["bootstrap","cfe","django","django-rest-framework","javascript","react","reactjs","rest-api","tutorial","tweetme","twitter"],"latest_commit_sha":null,"homepage":"https://cfe.sh/projects/tweetme-2","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codingforentrepreneurs.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-12-14T01:09:23.000Z","updated_at":"2024-03-11T05:54:16.000Z","dependencies_parsed_at":"2023-01-17T02:15:37.978Z","dependency_job_id":null,"html_url":"https://github.com/codingforentrepreneurs/Tweetme-2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codingforentrepreneurs/Tweetme-2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FTweetme-2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FTweetme-2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FTweetme-2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FTweetme-2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codingforentrepreneurs","download_url":"https://codeload.github.com/codingforentrepreneurs/Tweetme-2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FTweetme-2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531991,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bootstrap","cfe","django","django-rest-framework","javascript","react","reactjs","rest-api","tutorial","tweetme","twitter"],"created_at":"2026-01-18T06:00:31.426Z","updated_at":"2026-01-18T06:00:47.453Z","avatar_url":"https://github.com/codingforentrepreneurs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tweetme 2\nBuild a twitter-like app in Django, Bootstrap, Javascript, \u0026 React.js. Step-by-Step.\n\n[![Tweetme 2 Logo](https://static.codingforentrepreneurs.com/media/projects/tweetme-2/images/share/Tweetme2_share.jpg)](https://cfe.sh/projects/tweetme-2)\n\n### Lesson Code\n_Lessons 1-5: no significant code added_\n\n[6 - Updated VS Code Config](../../tree/c118bac532475dc16052c0ce5dce2d264d5c333a/)\n\n[7 - Our Roadmap](../../tree/c51618fea2bf4e7af336d1377d31b5ce4c376217/)\n\n[8 - The Tweets Model](../../tree/84a3ef90feeefa9e99264e832b0c73e4ded950a6/)\n\n[9 - Store Data from Django Model](../../tree/c08ef2bb515709610161838223b0b16fc0fc4cf3/)\n\n[10 - Intro to URL Routing and Dynamic Routing](../../tree/ef2e008e2a2b66130ec6e37a7b349f62ade71607/)\n\n[11 - Handling Dynamic Routing](../../tree/9b7d4ce7cdc049de4d77716599a3a9fed3fe7e2d/)\n\n[12 - Dynamic View into REST API Endpoint](../../tree/8823ffa71dc72a46ea5f51f2c4032d5101990929/)\n\n[13 - Our First Template](../../tree/cd504b8dd2b91fcf5ffa8de5a1a99cba2abad379/)\n\n[14 - Bootstrap \u0026 Django Templates](../../tree/6a9a5ec09ae1ed41bf84c37b5b667abe335e23a3/)\n\n[15 - Tweet List View](../../tree/f52194e263c6600b43b11dfcb10ad686b155dd92/)\n\n[16 - Dynamic Load Tweets via JavaScript](../../tree/935e371eca7e2926827d60107dd4d954f37fda03/)\n\n[17 - Replace HTML Content with JavaScript](../../tree/a3ed3ae82854a5fccae2970559a40e5cd260cadd/)\n\n[18 - Tweets to HTML via JavaScript](../../tree/30166801d0c48b38d91d95d9ae772ec2aa0c2682/)\n\n[19 - Format Tweet Method](../../tree/714f3c80aed3fb491f9dd894927e673b231114ae/)\n\n[20 - Like Button Rendering](../../tree/8124fe9de95400a65652d14a9c39def1dd9f2bdf/)\n\n[21 - Rapid Implement of Bootstrap Theme](../../tree/7335b554e18a1d1c0999447410dffcc6a92e2266/)\n\n[22 - Tweet Create Form](../../tree/4a56201848d5475b0ec8d4c59b22e307592eccae/)\n\n[23 - Tweet Form by Hand](../../tree/0a7553c2294fee17c1d1e84b92f27e532540d026/)\n\n[24 - Successful Form Redirect](../../tree/2e2f8c609e4815cba43468c8879823db0159c50f/)\n\n[25 - Safe URL Redirect](../../tree/83c9b9e47ec1afa96a7164701851427ecf61d50d/)\n\n[26 - Prevent Form Submit via JavaScript](../../tree/76cd131d96e7ef3690a62543fc4c23c75e63d4c6/)\n\n[27 - Sending Form Data via pure JavaScript](../../tree/76cd131d96e7ef3690a62543fc4c23c75e63d4c6/)\n\n[28 - Handling Ajax Requests](../../tree/99a8891b976d6acdb82a5a2b70676e9d23bd7e6f/)\n\n[29 - Serialize Django Model Object](../../tree/ebff9f8fe77005de4c1f1934d5818befd5e39c64/)\n\n[30 - Append New Tweet \u0026 Reorder](../../tree/c088d8b548a7c981f32a0cfd7151cff4a11fd528/)\n\n[31 - Handling Form Errors](../../tree/4b764cbc57f533e25b5fa973342da550a1e3ab91/)\n\n[32 - Rendering the Error Message via Vanilla JavaScript](../../tree/493d324165b47bc7b965916ab3233dc674991aee/)\n\n[33 - Users \u0026 Tweets](../../tree/bca1089afdd332ec077c896069af032d86957ab0/)\n\n[34 - Django Admin](../../tree/e4f6e285b029722925df1d58265a127d10224214/)\n\n[35 - Associate Authenticated User to Object](../../tree/b553fc641b4e40722aa632caa4aa5bad7e63879f/)\n\n[36 - Permissions \u0026 Roadmap](../../tree/c5e98a47214dc439290c32c8eb5315855cacb7bf/)\n\n[37 - Install Django Rest Framework](../../tree/f0b6d26180c5a8c86e2e30df7a2c0f3a585c4472/)\n\n[38 - Django Forms to Django Rest Framework Serializer](../../tree/773bd786a3bf114104e14b9cde54c4a5a1bf1cdf/)\n\n[39 - Django Views to Django Rest Framework Views](../../tree/c1fdd108faf2e8494c3f9125334dbfb3ea0479d2/)\n\n[40 - Permissions and Authentication Classes Decorators for DRF APIs](../../tree/62b13fef8bc0360c16180bc0a2ba91e26b91756d/)\n\n[41 - Delete Tweet API View](../../tree/fd97a4487f54ecc2f204f99fd08053f4133374a0/)\n\n[42 - Adding a Like Field](../../tree/0e72e11fdc4b9237465df622f8f4d6e2266e761b/)\n\n[43 - Understanding Setting ManyToMayFields](../../tree/d7dcc835547cd7946913fcd702e1cfdbb81c5b43/)\n\n[44 - Tweet Action View](../../tree/a801e54e56ec89c78be3fd675e1391d322fdc37d/)\n\n[45 - JavaScript Tweet Action Handler](../../tree/df5d9f6c4521ea0b3bab964d0ffb8ad93aa44b08/)\n\n[46 - CSRF \u0026 Client Side Action Buttons](../../tree/2902c65cb2072dbd66dce4ce89b56f1997127d7b/)\n\n[47 - Retweeting Logic](../../tree/8ad028e5aec09bfc74d5309d943f2cb2bc8fd7f3/)\n\n[48 - Two Types of Serializers](../../tree/5ae049e476bbcc12ed711bd508bdd1db35385a58/)\n\n[49 - Internal App Urls](../../tree/94d7f9c9e4304a32da36213ddfec00390f8a10eb/)\n\n[50 - Setting up Tests in Django](../../tree/863f1e597a9f2b9a6eab386cc55def479a9cc521/)\n\n_51 - Verify or Install Nodejs- no code_\n\n[52 - Create React App](../../tree/64af9c04b3138b8a65c059d2c448306dcfdb4f14/)\n\n[54 - Ajax lookup via XHR in Reactjs](../../tree/a324816b849c8488a5f442c213b43e988c267bcc/)\n\n[55 - Handling CORS and Invalid HOST_HEADER in Django](../../tree/28584e8be0455a8e6bb36a8236046843add92479/)\n\n[56 - Functional Components in React](../../tree/56e80ff0608360bf1083d39aab9d82e4a051a83f/)\n\n[57 - Reactjs Action Btn](../../tree/3d5c281e3b03bd99763efa137a74585438b3aaaf/)\n\n[58 - Using JavaScript Modules](../../tree/bc892166397e5bc09a575c721c23d4fad3882469/)\n\n[59 - Improved Action Btn](../../tree/17406366b1a5b1d360e25603868ee7b60920553d/)\n\n[60 - Understanding setState Hook](../../tree/3bc00466c918241db25420d3c222e4bf693ac185/)\n\n[61 - Handling a Form in React](../../tree/49553ed3e14b60ffa9453a545293812e85b64e9a/)\n\n[62 - Pass from Parent Component to Child with useEffect](../../tree/7a6310b5c82a3651b86450725c9b9502999f9ef6/)\n\n[63 - Adjust the React Render Process](../../tree/168382442ca1efeb90067c9c2ebd92a90027bb90/)\n\n[64 - React Rendered by Django](../../tree/7f33ea9f9eab6c07345db535ff02d81b9c471871/)\n\n[65 - Render React App via Any Django Template](../../tree/2763cd207d10ba25737bc9c5fd45f2a76b332e4e/)\n\n[66 - A Better XHR Lookup](../../tree/6dfdf9913f7389235bc0ca81c0deec6f90c76f04/)\n\n[67 - Create Tweet in React](../../tree/864b60b7ca7d7de211d6efd1de631146d068a010/)\n\n[68 - Dev Authentication](../../tree/944cbcb5ad4c535eacf51aa6645f816e72f30edc/)\n\n[69 - Handling New Tweet](../../tree/cd3a15c77d4343a11f65485132e88951929af393/)\n\n[70 - API Methods in React](../../tree/5133bd4a589f180e3332a02de3a435b2418b4f0d/)\n\n[71 - Tweet Action Btn](../../tree/8cab91c9fc6e678aa04cf3141110ebf56a7d913e/)\n\n[72 - Rendering the ReTweet](../../tree/987ded4a6a4e1a1f4ab47e38d085e9ce325571c2/)\n\n[73 - Improving the Tweet Action Button](../../tree/8f89a740e4db66cbd82879b26f08a6600318cb5a/)\n\n[74 - Prepending Dynamic Retweets](../../tree/3fd141a06ebcdc9b27bd1ad779b1942771a04588/)\n\n[75 - Set Data Props on ReactDOM Render](../../tree/82eb8cf2e88e5a1aa99947103a5a10f666a36c2e/)\n\n[76 - Limit List View by Username](../../tree/c5306bb9cacac68268a1ac5bd4eb28f5610e2767/)\n\n[77 - Rendering Limited Tweet List by Username](../../tree/5c7b86ad592bff6106826f4bfeb4f9120f5b63ca/)\n\n[78 - Tweets Module Clean Up](../../tree/33af1a02d078540a14a74384b347313de2333f24/)\n\n[79 - Lookup \u0026 Render \u0026 Embed Individual Tweets](../../tree/eb194546aa4202e6f1fbb46a69fecdc9e30e1311/)\n\n[80 - Linking Individual Tweets](../../tree/55d983e16241705e01128164d351249cfb4267c8/)\n\n[81 - Build and Use On Django](../../tree/9b524ac3a9e42139666fe10fb548833df8e5be5c/)\n\n[82 - Clean Up API Urls and Views](../../tree/ac6fa11b6084f5e82fe8c7675f1858ab2e3fcb6e/)\n\n[83 - Login Required Redirect](../../tree/e4761aa629c02c665be78b6f82c9fb26a4219d7a/)\n\n[84 - Authentication \u0026 Registration](../../tree/b2b410fd524924eb73b8491a4785a5fdfc8f281f/)\n\n[85 - User Profiles](../../tree/889c7cbf37b43a1320c6231186ab412225a46f7c/)\n\n[86 - Handling Profile Does Not Exist](../../tree/061c715c81acbfc705c50a09c9fd7860353d335e/)\n\n[87 - Signals to Create Profile Objects](../../tree/b331593f11aa5d792f5cc1a4916bb829a12196b4/)\n\n[88 - Save 2 Models in 1 Form and 1 View](../../tree/4a46592de493f19f0e2d1a8cb12ff154a028d805/)\n\n[89 - ManyToManyField and Reverse Relations](../../tree/c52b4ca2b0b4d09bb34b5ba06b57440937eeb845/)\n\n[90 - Followers and Following](../../tree/749ba392ebacf799305d4f017dc99fe69462ffc7/)\n\n[91 - Follow Button Logic and Endpoint](../../tree/bcb308d5c132a34defc521231f6315a26317b14a/)\n\n[92 - Profile Following Unit Tests](../../tree/eec3476bd41768d4899125b17ebd5a8d144e2c55/)\n\n[93 - User Feed including Following](../../tree/2b76f4e9834dcd21474b286bdec4248343ecc306/)\n\n[94 - More Effecient Backend Lookups and Custom Model Managers](../../tree/0b1f4b907bad5d4bdfb525804edefeeb626bf79b/)\n\n[95 - More Efficient List Views with Pagination](../../tree/7c89ad7c014a7b431dba55b8986f7cc71d0c8439/)\n\n[96 - User Profile Serializer](../../tree/d7fd9517d591f91082374ead775991e94ec4b290/)\n\n[97 - Handling our New List View Response](../../tree/2a6f0106c1877df5d39512aa161889e17b9a502b/)\n\n[98 - Handling Pagination in React](../../tree/0c39d7474d64966682bb642dce2befd56de17dd6/)\n\n[99 - Display User Within Tweet](../../tree/877884675610faee2335df06c4c1cb67df5644e7/)\n\n[100 - Display Tweet User Details](../../tree/161ff2d8a7236c20d8b9addbcc578150de09651b/)\n\n[101 - Feed View Component](../../tree/f5e1eb899c6bd2d4f7d89b12f3d741e2e57777ed/)\n\n[102 - Build for the Feed](../../tree/116a480560e10021bb33299c4e0fcdcc4d560752/)\n\n[103 - User Profile API Detail](../../tree/72db184c5a6b9338eecba1c2df630812fa269faa/)\n\n[104 - Passing the Request to Serializers](../../tree/aa9379e967c4d8feae5e577df743327a707456a5/)\n\n[105 - Render Profile Badge Component](../../tree/cbc23c43d7eeec86c5bd0c0e0242f824bdc95b1f/)\n\n[106 - The Follow Button](../../tree/214190819624697713aab6cc9b5da3fc70e2e8b3/)\n\n[107 - Removing Redundant Profile View](../../tree/5ebfac71d174b4869c367c79095df554fa0ec97a/)\n\n[108 - Display Follower Count with Numeraljs](../../tree/62f930450531e07039a650401cbb3aac852bdc37/)\n\n[109 - FInal Build](../../tree/7ce03e49253bed9e4a55f5ab985f92b047fa736c/)\n\n**110 - Thank you and next steps** _no code_\n\nNext steps:\n- Large File Uploads for Images ~ [Dive into AWS](https://cfe.sh/courses/aws)\n- Notifications\n- Direct Messages / Private Inboxes ~ [Chat x Channels](https://cfe.sh/courses/chat-channels-react)\n- Explore -\u003e parse \u0026 filter for hashtags\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingforentrepreneurs%2Ftweetme-2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodingforentrepreneurs%2Ftweetme-2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingforentrepreneurs%2Ftweetme-2/lists"}