title
Django Rest Framework & React Tutorial: Learning Management System (Blackboard / Moodle Clone)

description
In this intermediate Python Django tutorial you will learn to create a multiple-user system using React and the Django Rest Framework. We'll be building an online school where teachers can create assignments that students can complete and view their results. 💻 Clone this repo to get started: https://github.com/justdjango/django-react-boilerplate 💻 Full code: https://github.com/justdjango/teach-me-django 🔗 How to setup authentication between Django and React: https://youtu.be/BxzO2M7QcZw 🎥 Course from JustDjango. Check out their YouTube channel: https://www.youtube.com/channel/UCRM1gWNTDx0SHIqUJygD-kQ 📄 Want to learn how to deploy your projects? Check out JustDjango's course on Udemy: https://www.udemy.com/learn-to-deploy-django/ 🐦 JustDjango on Twitter: https://twitter.com/justdjangocode -- Learn to code for free and get a developer job: https://www.freecodecamp.org Read hundreds of articles on programming: https://medium.freecodecamp.org And subscribe for new videos on technology: https://youtube.com/subscription_center?add_user=freecodecamp

detail
{'title': 'Django Rest Framework & React Tutorial: Learning Management System (Blackboard / Moodle Clone)', 'heatmap': [{'end': 7574.943, 'start': 7444.544, 'weight': 1}], 'summary': 'Tutorial covers building a multiple user system, custom user configuration, user authentication, local storage, django models, api setup, react redux implementation, handling forms and assignments, creating and updating graded assignments, with resolved errors and successful integrations.', 'chapters': [{'end': 107.011, 'segs': [{'end': 24.336, 'src': 'embed', 'start': 1, 'weight': 0, 'content': [{'end': 8.606, 'text': 'Welcome to the start of a new tutorial series, and this is called teach me Django, which is a project built with Django, and react,', 'start': 1, 'duration': 7.606}, {'end': 15.671, 'text': 'showing you how you can work with multiple users in a kind of mock online system where you can create assignments,', 'start': 8.606, 'duration': 7.065}, {'end': 18.673, 'text': 'fill them in and see the results of those assignments on your profile.', 'start': 15.671, 'duration': 3.002}, {'end': 21.594, 'text': 'And so this is the finished product of that project.', 'start': 19.153, 'duration': 2.441}, {'end': 24.336, 'text': "And what I'm going to do is just walk you through what it looks like.", 'start': 21.995, 'duration': 2.341}], 'summary': 'Tutorial series on creating a project with django and react for a mock online system with multiple users and assignments.', 'duration': 23.336, 'max_score': 1, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1000.jpg'}, {'end': 93.658, 'src': 'embed', 'start': 69.36, 'weight': 1, 'content': [{'end': 75.444, 'text': 'And now we have our assignments and assignment that is loaded here.', 'start': 69.36, 'duration': 6.084}, {'end': 76.845, 'text': 'And we can click on it.', 'start': 76.104, 'duration': 0.741}, {'end': 78.486, 'text': 'And we see we get the questions here.', 'start': 77.185, 'duration': 1.301}, {'end': 79.727, 'text': "And we've only got two questions.", 'start': 78.506, 'duration': 1.221}, {'end': 83.95, 'text': "So we've got is this cool? We'll say yes, go to the next one.", 'start': 79.787, 'duration': 4.163}, {'end': 86.592, 'text': "we'll see Django is awesome.", 'start': 84.71, 'duration': 1.882}, {'end': 89.655, 'text': "And let's say I want to go back and I'm actually going to change mine.", 'start': 86.812, 'duration': 2.843}, {'end': 90.976, 'text': "So we'll say no, this isn't cool.", 'start': 89.675, 'duration': 1.301}, {'end': 91.917, 'text': 'Go forward.', 'start': 91.376, 'duration': 0.541}, {'end': 92.978, 'text': 'Django is awesome.', 'start': 92.117, 'duration': 0.861}, {'end': 93.658, 'text': "We'll say true.", 'start': 93.018, 'duration': 0.64}], 'summary': "2 questions in the assignment, with 1 'yes' and 1 'no' response", 'duration': 24.298, 'max_score': 69.36, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo69360.jpg'}], 'start': 1, 'title': 'Teach me django project overview', 'summary': 'Introduces the teach me django project, demonstrating user interactions and achieving a 50% score for a sample assignment.', 'chapters': [{'end': 107.011, 'start': 1, 'title': 'Teach me django project overview', 'summary': 'Introduces the teach me django project, showcasing how users can interact with the system to create assignments, answer questions, and view their results, ultimately achieving a 50% score for a sample assignment.', 'duration': 106.011, 'highlights': ['Users can create assignments, answer questions, and view results, achieving a 50% score for a sample assignment. The project allows users to create assignments, answer questions, and view their results, with the sample assignment resulting in a 50% score.', 'The project is built with Django and React, providing a mock online system for multiple users. The project is developed using Django and React to offer a mock online system for multiple users.', 'The tutorial series aims to guide users in working with Django and React to create a system for managing assignments. The tutorial series aims to guide users in working with Django and React to create a system for managing assignments, providing a practical learning experience.']}], 'duration': 106.011, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1000.jpg', 'highlights': ['The tutorial series aims to guide users in working with Django and React to create a system for managing assignments, providing a practical learning experience.', 'The project allows users to create assignments, answer questions, and view their results, with the sample assignment resulting in a 50% score.', 'The project is developed using Django and React to offer a mock online system for multiple users.']}, {'end': 848.387, 'segs': [{'end': 183.596, 'src': 'embed', 'start': 107.011, 'weight': 0, 'content': [{'end': 117.243, 'text': "before judging how complete this project is in terms of validation and seeing detail views and thinking there's a lot more stuff to be displayed and that this is really just too basic,", 'start': 107.011, 'duration': 10.232}, {'end': 120.988, 'text': "you'll be surprised as to how much actually goes on in the backend to get this to work.", 'start': 117.243, 'duration': 3.745}, {'end': 128.114, 'text': "And so we're going to be jumping into a whole lot of customization of serializers and, and a lot of react as well.", 'start': 121.508, 'duration': 6.606}, {'end': 135.68, 'text': "So this is what we're going to be building in this project where the two different kinds of users we're looking at our students and teachers.", 'start': 128.614, 'duration': 7.066}, {'end': 139.363, 'text': 'only teachers can actually create these assignments.', 'start': 135.68, 'duration': 3.683}, {'end': 144.127, 'text': 'And only students, in theory should be allowed to answer these assignments.', 'start': 140.144, 'duration': 3.983}, {'end': 148.33, 'text': "And so we're going to walk you through the process of creating this multiple user system.", 'start': 144.807, 'duration': 3.523}, {'end': 150.332, 'text': "And let's get started with it now.", 'start': 148.851, 'duration': 1.481}, {'end': 165.25, 'text': "So, to get started, you're going to want to open up VS code.", 'start': 162.589, 'duration': 2.661}, {'end': 167.43, 'text': "I've got absolutely nothing here.", 'start': 165.25, 'duration': 2.18}, {'end': 170.691, 'text': "an empty directory which we'll use to store all the project content.", 'start': 167.43, 'duration': 3.261}, {'end': 174.953, 'text': "And to get started, we're actually going to clone something from our GitHub page.", 'start': 171.312, 'duration': 3.641}, {'end': 180.615, 'text': 'And this is a boilerplate project that we created for getting started with Django and react.', 'start': 175.013, 'duration': 5.602}, {'end': 183.596, 'text': 'And that is here the Django react boilerplate.', 'start': 181.295, 'duration': 2.301}], 'summary': 'Project involves customizing serializers and react for multiple user system with focus on teachers creating assignments and students answering them.', 'duration': 76.585, 'max_score': 107.011, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo107011.jpg'}, {'end': 301.624, 'src': 'embed', 'start': 273.658, 'weight': 3, 'content': [{'end': 278.643, 'text': 'virtual environment path and some files to exclude in our VS code editor.', 'start': 273.658, 'duration': 4.985}, {'end': 285.069, 'text': "We've got the home directory, which has a base settings for all the installed apps, middleware templates.", 'start': 279.103, 'duration': 5.966}, {'end': 289.673, 'text': "and some other things that we'll need for both development and production.", 'start': 286.11, 'duration': 3.563}, {'end': 293.617, 'text': "And then in development, you've got the allowed hosts being our local host.", 'start': 290.034, 'duration': 3.583}, {'end': 301.624, 'text': 'debug being true, the WSGI application for development and a db sqlite three database setup,', 'start': 293.617, 'duration': 8.007}], 'summary': 'Configuring virtual environment path and settings for development and production.', 'duration': 27.966, 'max_score': 273.658, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo273658.jpg'}, {'end': 521.785, 'src': 'embed', 'start': 497.589, 'weight': 4, 'content': [{'end': 505.195, 'text': 'And basically what this means is that it has all those attributes like username, password, email, all of that configuration is done for you.', 'start': 497.589, 'duration': 7.606}, {'end': 513.12, 'text': 'Except now, you can add the fields that you particularly want to actually add that will make your users that much more unique.', 'start': 505.715, 'duration': 7.405}, {'end': 516.121, 'text': "Now, in our case, we're going to store two kinds of users.", 'start': 513.6, 'duration': 2.521}, {'end': 518.884, 'text': "we're going to have a student and a teacher.", 'start': 516.121, 'duration': 2.763}, {'end': 521.785, 'text': "you could be both at the same time, but we're not too worried about that.", 'start': 518.884, 'duration': 2.901}], 'summary': 'A system with preconfigured attributes allows adding unique user fields; supports student and teacher roles.', 'duration': 24.196, 'max_score': 497.589, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo497589.jpg'}, {'end': 738.199, 'src': 'embed', 'start': 716.09, 'weight': 5, 'content': [{'end': 725.454, 'text': "And now, if we were to try and create a super user, then you'll see that you'll actually run into an error because it's going to use our custom user,", 'start': 716.09, 'duration': 9.364}, {'end': 726.934, 'text': 'which has two extra fields on it.', 'start': 725.454, 'duration': 1.48}, {'end': 733.237, 'text': "So it's going to tell you that is student cannot be null and is teacher cannot be null in that user.", 'start': 727.014, 'duration': 6.223}, {'end': 738.199, 'text': "So to create an admin user, we're going to need to create it through the Python shell.", 'start': 733.457, 'duration': 4.742}], 'summary': 'Creating a super user with custom fields requires creation through the python shell.', 'duration': 22.109, 'max_score': 716.09, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo716090.jpg'}], 'start': 107.011, 'title': 'Building a multiple user system', 'summary': 'Focuses on building a multiple user system for students and teachers, involving customization of serializers and react for creating and answering assignments, and covers setting up a boilerplate project for django and react, including cloning from github, configuring project settings for development and production, creating custom users with unique fields, and resolving errors in user creation and authentication.', 'chapters': [{'end': 150.332, 'start': 107.011, 'title': 'Building multiple user system', 'summary': 'Focuses on building a multiple user system for students and teachers and involves customization of serializers and react for creating and answering assignments.', 'duration': 43.321, 'highlights': ['The project involves building a multiple user system for students and teachers. The project focuses on creating a system for two different kinds of users - students and teachers, where only teachers can create assignments and only students can answer them.', 'Customization of serializers and react is required for the project. The backend customization involves a lot of work on serializers, and there is also a significant amount of work to be done on the frontend using react.']}, {'end': 848.387, 'start': 162.589, 'title': 'Setting up django and react boilerplate', 'summary': 'Covers setting up a boilerplate project for django and react, including cloning from github, configuring project settings for development and production, creating custom users with unique fields, and resolving errors in user creation and authentication.', 'duration': 685.798, 'highlights': ['Cloning boilerplate project from GitHub The speaker clones a boilerplate project for Django and React from GitHub to expedite project setup.', 'Configuring project settings for development and production The speaker explains the different settings files for development and production, including details such as allowed hosts, database setup, and static files storage.', "Creating custom users with unique fields The speaker demonstrates the process of creating custom users with unique fields, such as 'is student' and 'is teacher', and linking them to the default user model.", 'Resolving errors in user creation and authentication The speaker addresses errors encountered during user creation and authentication, providing a step-by-step solution using the Python shell to create an admin user with custom fields.']}], 'duration': 741.376, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo107011.jpg', 'highlights': ['The project involves building a multiple user system for students and teachers.', 'Customization of serializers and react is required for the project.', 'Cloning boilerplate project from GitHub to expedite project setup.', 'Configuring project settings for development and production, including details such as allowed hosts, database setup, and static files storage.', "Creating custom users with unique fields, such as 'is student' and 'is teacher', and linking them to the default user model.", 'Resolving errors in user creation and authentication, providing a step-by-step solution using the Python shell to create an admin user with custom fields.']}, {'end': 1653.218, 'segs': [{'end': 873.91, 'src': 'embed', 'start': 849.068, 'weight': 1, 'content': [{'end': 856.215, 'text': "And the reason for this is purely because we haven't set up rest auth to understand our new custom user,", 'start': 849.068, 'duration': 7.147}, {'end': 863.681, 'text': "because the custom user is trying to see the default Django user that it's used to, but we're not using the default user.", 'start': 856.215, 'duration': 7.466}, {'end': 865.103, 'text': "we're using our own custom user.", 'start': 863.681, 'duration': 1.422}, {'end': 867.645, 'text': 'So we need to go into our base.py.', 'start': 865.643, 'duration': 2.002}, {'end': 873.91, 'text': 'And we need to configure the rest auth serializers and the rest auth register serializers.', 'start': 867.665, 'duration': 6.245}], 'summary': 'The issue arises due to the mismatch between the default django user and the custom user, requiring configuration of rest auth serializers and register serializers in base.py.', 'duration': 24.842, 'max_score': 849.068, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo849068.jpg'}, {'end': 943.77, 'src': 'embed', 'start': 897.766, 'weight': 0, 'content': [{'end': 904.591, 'text': 'Possible key values are the login serializer, the token serializer, the user detail serializer, and all these.', 'start': 897.766, 'duration': 6.825}, {'end': 912.974, 'text': 'So for example, it says the rest auth serializers is a dictionary, where the login serializer is a path to a custom login serializer.', 'start': 905.311, 'duration': 7.663}, {'end': 915.034, 'text': 'And the same thing for the token serializer.', 'start': 913.494, 'duration': 1.54}, {'end': 919.936, 'text': 'And it also says yeah, you can define your custom serializers for registration.', 'start': 915.655, 'duration': 4.281}, {'end': 929.079, 'text': 'However, note, the custom register serializer must define a define save method that returns a user model instance.', 'start': 920.536, 'duration': 8.543}, {'end': 931.36, 'text': "And that's extremely important if we want to get this right.", 'start': 929.199, 'duration': 2.161}, {'end': 937.405, 'text': "So first, let's copy this default configuration, they come back into base, add it there.", 'start': 932.04, 'duration': 5.365}, {'end': 939.587, 'text': "And we don't need the token serializer.", 'start': 937.725, 'duration': 1.862}, {'end': 943.77, 'text': 'We just need the user details serializer.', 'start': 940.427, 'duration': 3.343}], 'summary': 'Custom serializers like login, token, and user detail are important for defining custom register serializer.', 'duration': 46.004, 'max_score': 897.766, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo897766.jpg'}, {'end': 1306.949, 'src': 'embed', 'start': 1275.631, 'weight': 3, 'content': [{'end': 1278.373, 'text': "So that's how we're going to access it from the forms values.", 'start': 1275.631, 'duration': 2.742}, {'end': 1282.855, 'text': "And we'll say please select a user.", 'start': 1279.533, 'duration': 3.322}, {'end': 1286.797, 'text': "And we'll get rid of the validator here as well.", 'start': 1284.536, 'duration': 2.261}, {'end': 1291.899, 'text': 'And inside the select, we need to add an option.', 'start': 1288.257, 'duration': 3.642}, {'end': 1294.701, 'text': 'And inside there will be student.', 'start': 1292.74, 'duration': 1.961}, {'end': 1306.949, 'text': 'And the second one will be teacher will set the value of the first one to be student and the value of the second one to be teacher.', 'start': 1295.441, 'duration': 11.508}], 'summary': 'Updating form values and options, including student and teacher roles.', 'duration': 31.318, 'max_score': 1275.631, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1275631.jpg'}, {'end': 1395.304, 'src': 'embed', 'start': 1361.975, 'weight': 5, 'content': [{'end': 1365.277, 'text': 'And this will get passed into the on auth dispatch method.', 'start': 1361.975, 'duration': 3.302}, {'end': 1371.661, 'text': 'So if we go to the bottom, here we have on auth, and we just need to make sure we pass that in as a fifth argument.', 'start': 1365.357, 'duration': 6.304}, {'end': 1373.463, 'text': 'So this will be is student.', 'start': 1372.002, 'duration': 1.461}, {'end': 1379.127, 'text': 'And that gets passed into the auth signup which is inside our actions.', 'start': 1374.223, 'duration': 4.904}, {'end': 1382.691, 'text': "And we'll add it as another argument there, as well, just like that.", 'start': 1379.427, 'duration': 3.264}, {'end': 1386.555, 'text': 'And now we just need to make sure that we handle that in the store.', 'start': 1383.351, 'duration': 3.204}, {'end': 1395.304, 'text': 'So if you go to store actions auth, then here, if we scroll down to the auth sign up, we need to make sure that we grab that argument coming in,', 'start': 1386.675, 'duration': 8.629}], 'summary': 'Updating on auth dispatch method to include isstudent as a fifth argument.', 'duration': 33.329, 'max_score': 1361.975, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1361975.jpg'}, {'end': 1475.772, 'src': 'embed', 'start': 1450.715, 'weight': 4, 'content': [{'end': 1456.901, 'text': "So that, instead of setting the item of a token and an expiration date, we're rather just going to set an entire user,", 'start': 1450.715, 'duration': 6.186}, {'end': 1461.205, 'text': 'which will hold the token username and all the details about that user.', 'start': 1456.901, 'duration': 4.304}, {'end': 1466.088, 'text': "So that way, we can store whether they're a student, or a teacher as well.", 'start': 1461.986, 'duration': 4.102}, {'end': 1471.25, 'text': "So what I'm going to do is actually get rid of these local storage commands here.", 'start': 1467.008, 'duration': 4.242}, {'end': 1475.772, 'text': "But before we do that, we'll create another constant here, which will be our user.", 'start': 1471.35, 'duration': 4.422}], 'summary': 'Changing token storage to user storage for storing user details.', 'duration': 25.057, 'max_score': 1450.715, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1450715.jpg'}], 'start': 849.068, 'title': 'Custom user configuration in django', 'summary': "Covers configuring rest auth serializers and rest auth register serializers for a custom user in django, including defining custom serializers for login, token, user details, and registration. it also involves adding a user type selection field to the registration form, enabling users to choose between 'student' and 'teacher', altering the form submission process, and updating the local storage handling to include user type data.", 'chapters': [{'end': 1195.614, 'start': 849.068, 'title': 'Configuring custom user in django rest auth', 'summary': 'Discusses configuring rest auth serializers and rest auth register serializers for a custom user in django, including defining custom serializers for login, token, user details, and registration, and the requirement of a save method in the custom register serializer.', 'duration': 346.546, 'highlights': ['Configuring rest auth serializers and rest auth register serializers for a custom user in Django The chapter discusses the process of configuring rest auth serializers and rest auth register serializers for a custom user in Django, including defining custom serializers for login, token, user details, and registration.', 'Defining custom serializers for login, token, user details, and registration The chapter emphasizes the need to define custom serializers for login, token, user details, and registration endpoints in Django rest auth, providing flexibility and customization for each endpoint.', 'Requirement of a save method in the custom register serializer The chapter stresses the importance of defining a save method that returns a user model instance in the custom register serializer, highlighting the necessity for proper implementation to ensure correct functionality.']}, {'end': 1653.218, 'start': 1195.814, 'title': 'Adding user type to registration form', 'summary': "Involves adding a user type selection field to a registration form, enabling users to choose between 'student' and 'teacher', altering the form submission process, and updating the local storage handling to include user type data.", 'duration': 457.404, 'highlights': ["A user type selection field is added to the registration form, allowing users to choose between 'student' and 'teacher'. The chapter involves adding a user type selection field to a registration form, enabling users to choose between 'student' and 'teacher'.", 'The form submission process is altered to include the selected user type, which is then passed into the on auth dispatch method. The form submission process is altered to include the selected user type, which is then passed into the on auth dispatch method.', 'The local storage handling is updated to include the user type data, storing the entire user object instead of just the token and expiration date. The local storage handling is updated to include the user type data, storing the entire user object instead of just the token and expiration date.']}], 'duration': 804.15, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo849068.jpg', 'highlights': ['Defining custom serializers for login, token, user details, and registration', 'Configuring rest auth serializers and rest auth register serializers for a custom user in Django', 'Requirement of a save method in the custom register serializer', "A user type selection field is added to the registration form, allowing users to choose between 'student' and 'teacher'", 'The local storage handling is updated to include the user type data, storing the entire user object instead of just the token and expiration date', 'The form submission process is altered to include the selected user type, which is then passed into the on auth dispatch method']}, {'end': 2937.768, 'segs': [{'end': 1710.682, 'src': 'embed', 'start': 1679.909, 'weight': 0, 'content': [{'end': 1680.909, 'text': "So we'll take a look here.", 'start': 1679.909, 'duration': 1}, {'end': 1684.551, 'text': 'And it says in actions auth, we have is teachers undefined.', 'start': 1681.229, 'duration': 3.322}, {'end': 1689.134, 'text': 'And that we just need to set to the opposite of is student.', 'start': 1685.332, 'duration': 3.802}, {'end': 1695.356, 'text': "And it says that the signup JS doesn't contain an export named options.", 'start': 1690.474, 'duration': 4.882}, {'end': 1696.577, 'text': "So let's go to sign up.", 'start': 1695.416, 'duration': 1.161}, {'end': 1702.759, 'text': 'And this is because our option inherits from the select.', 'start': 1697.337, 'duration': 5.422}, {'end': 1710.682, 'text': 'So we just need to say constant option equals to select dot option.', 'start': 1703.779, 'duration': 6.903}], 'summary': 'Identified issues in actions auth and signup js, such as undefined teachers and missing export named options.', 'duration': 30.773, 'max_score': 1679.909, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1679909.jpg'}, {'end': 2134.047, 'src': 'embed', 'start': 2107.075, 'weight': 3, 'content': [{'end': 2113.706, 'text': "So if we come back to the boilerplate, and this is actually on the localhost, let's go to port 3000 and click sign up.", 'start': 2107.075, 'duration': 6.631}, {'end': 2124.078, 'text': 'And look at that, it was a successful post request, and we got a status of 201, which means that our user was created.', 'start': 2116.912, 'duration': 7.166}, {'end': 2130.324, 'text': "And if you come back here, you can see that it's now saying log out, which means that our users actually logged in.", 'start': 2125.54, 'duration': 4.784}, {'end': 2134.047, 'text': 'And that means we can actually go and log in to our admin.', 'start': 2131.044, 'duration': 3.003}], 'summary': 'Successful sign up with a status of 201, user created, and logged in.', 'duration': 26.972, 'max_score': 2107.075, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo2107075.jpg'}, {'end': 2336.894, 'src': 'embed', 'start': 2315.029, 'weight': 1, 'content': [{'end': 2326.992, 'text': "we finished working on logging in and creating our own custom user in the front end and customizing our serializer with Django's rest auth package to handle that in the back end.", 'start': 2315.029, 'duration': 11.963}, {'end': 2336.894, 'text': "And in this one we're just going to finish off the user by adding in a view set to allow us to actually view all our users and also to view each user's profile.", 'start': 2327.672, 'duration': 9.222}], 'summary': 'Finished custom user creation and added view set for user profiles.', 'duration': 21.865, 'max_score': 2315.029, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo2315029.jpg'}], 'start': 1653.978, 'title': 'User authentication, model overriding, and custom user management', 'summary': "Covers debugging user authentication issues, resolving errors such as 'is teachers undefined', 'signup js doesn't contain an export named options', and 'integrity error, not null constraint failed users dot user dot is student', while providing steps for resolution. it also discusses overriding the save method to create a custom user model, successfully testing the user creation process with a status of 201, creating a custom user in django, logging in with the created user, customizing the admin interface, and creating an assignment serializer. additionally, it covers creating a user model with specified fields and permissions, adding a user interface for displaying and adding users, and creating an api for fetching and displaying user profiles using django and react.", 'chapters': [{'end': 1812.183, 'start': 1653.978, 'title': 'User authentication debugging', 'summary': "Covers debugging user authentication issues, resolving errors such as 'is teachers undefined', 'signup js doesn't contain an export named options', and 'integrity error, not null constraint failed users dot user dot is student', while providing steps for resolution.", 'duration': 158.205, 'highlights': ["The chapter covers debugging user authentication issues, resolving errors such as 'is teachers undefined', 'signup JS doesn't contain an export named options', and 'integrity error, not null constraint failed users dot user dot is student', while providing steps for resolution.", "A username, email, password, and user type can be provided during the sign-up process, with 'student' and 'teacher' as the available options for user type.", "Debugging steps include adding the necessary path to the register serializer and ensuring the correct values are passed during user creation to avoid the 'integrity error, not null constraint failed users dot user dot is student' issue.", "The issue of 'is teachers undefined' can be resolved by setting it to the opposite of 'is student' in the auth actions.", "The 'signup JS doesn't contain an export named options' error can be resolved by setting the constant option to select dot option."]}, {'end': 2130.324, 'start': 1812.623, 'title': 'Overriding save method for user creation', 'summary': "Discusses overriding the save method to create a custom user model, utilizing an adapter from django's all auth, and successfully testing the user creation process with a status of 201.", 'duration': 317.701, 'highlights': ["The save method must be overridden to utilize the 'is student' and 'is teacher' fields for user creation, involving an adapter from Django's all auth.", "Utilizing the adapter from Django's all auth, the process involves creating a new user using the request and saving the user, with additional custom setup for user email.", 'Testing the user creation process resulted in a successful post request with a status of 201, indicating the user was created.']}, {'end': 2447.46, 'start': 2131.044, 'title': 'Custom user and admin management', 'summary': 'Covers the process of creating a custom user in django, logging in with the created user, and customizing the admin interface, with a focus on creating a view set to view all users and their profiles, and creating an assignment serializer.', 'duration': 316.416, 'highlights': ["Creating a custom user in Django and logging in with the created user The process involves creating a custom user 'Matt' and logging in with the created user, 'test' and verifying successful login, thus confirming the correct working of the signup and login processes.", "Customizing the admin interface to manage users and their display The customization includes overriding the default form in the admin to create a custom form for managing users, using the 'user admin' module, and inheriting and registering a custom user admin class.", 'Adding a view set to view all users and their profiles, and creating an assignment serializer The next steps involve adding a view set to allow viewing of all users and their profiles, as well as creating an assignment serializer to facilitate the creation of assignments, with a reference to navigational instructions on GitHub for further details.']}, {'end': 2937.768, 'start': 2448.16, 'title': 'Creating user model and api', 'summary': 'Covers creating a user model with specified fields and permissions, adding a user interface for displaying and adding users, and creating an api for fetching and displaying user profiles using django and react.', 'duration': 489.608, 'highlights': ['Creating user model with specified fields and permissions The speaker outlines the process of adding field sets and permissions to the user model, including specifying fields like email, username, and password, and setting up display options like list display and search fields.', 'Creating API for fetching and displaying user profiles The chapter explains the creation of a view set for the user model, setting up URLs, and displaying user lists and individual user instances using Django rest framework, and creating a component for handling user profiles using React.', 'Adding a user interface for displaying and adding users The speaker demonstrates the process of adding fields and permissions to the user interface for displaying and adding users, as well as creating an API for user model to fetch users and display profiles.']}], 'duration': 1283.79, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo1653978.jpg', 'highlights': ["Resolving 'is teachers undefined' error by setting it to the opposite of 'is student' in the auth actions.", "Creating a custom user in Django and logging in with the created user, 'Matt', and verifying successful login.", 'Adding a user interface for displaying and adding users, and creating an API for fetching and displaying user profiles using Django and React.', 'Testing the user creation process resulted in a successful post request with a status of 201, indicating the user was created.']}, {'end': 3596.843, 'segs': [{'end': 3020.293, 'src': 'embed', 'start': 2967.836, 'weight': 3, 'content': [{'end': 2978.044, 'text': "Now. the reason why we're not actually getting the username showing is because our login method did not save the user into the local storage.", 'start': 2967.836, 'duration': 10.208}, {'end': 2979.225, 'text': 'we still need to configure that.', 'start': 2978.044, 'duration': 1.181}, {'end': 2980.746, 'text': "So let's head back here.", 'start': 2979.765, 'duration': 0.981}, {'end': 2985.728, 'text': 'And what we want to do is go to the store and to our actions of auth.', 'start': 2981.166, 'duration': 4.562}, {'end': 2993.112, 'text': 'And here, with the auth login method, we basically just want to kind of do the same thing as what we did here,', 'start': 2986.268, 'duration': 6.844}, {'end': 2997.534, 'text': 'where we created a user and then store that user in the local storage.', 'start': 2993.112, 'duration': 4.422}, {'end': 2998.714, 'text': "So we'll just copy that.", 'start': 2997.554, 'duration': 1.16}, {'end': 3001.636, 'text': "And we'll do that right after we get a response.", 'start': 2999.815, 'duration': 1.821}, {'end': 3010.063, 'text': 'where the token is the response data key, the username is the username, the is student is going to come from the data as well.', 'start': 3002.276, 'duration': 7.787}, {'end': 3016.59, 'text': 'So we say response dot data dot user type dot is student.', 'start': 3010.104, 'duration': 6.486}, {'end': 3020.293, 'text': "And then we'll pass the same thing for his teacher.", 'start': 3017.23, 'duration': 3.063}], 'summary': 'Fix auth login method to save user details in local storage.', 'duration': 52.457, 'max_score': 2967.836, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo2967836.jpg'}, {'end': 3088.832, 'src': 'embed', 'start': 3067.706, 'weight': 0, 'content': [{'end': 3078.41, 'text': 'And if we go to serializers Now, the reason for this custom serializer, so that when we log in, we receive not only the key from Django rest auth,', 'start': 3067.706, 'duration': 10.704}, {'end': 3082.911, 'text': 'meaning the token, but we also want to actually get the user type.', 'start': 3078.41, 'duration': 4.501}, {'end': 3085.912, 'text': 'And that being either a student or a teacher.', 'start': 3083.811, 'duration': 2.101}, {'end': 3088.832, 'text': 'And we also want to get the user ID.', 'start': 3086.432, 'duration': 2.4}], 'summary': 'Custom serializer to include user type and id when logging in.', 'duration': 21.126, 'max_score': 3067.706, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo3067706.jpg'}, {'end': 3542.652, 'src': 'embed', 'start': 3517.839, 'weight': 1, 'content': [{'end': 3523.642, 'text': 'And so that ends this tutorial, basically just confirming that our users are able to actually log in.', 'start': 3517.839, 'duration': 5.803}, {'end': 3530.026, 'text': "And we're able to store the user ID and the type of user that they are inside our local storage,", 'start': 3524.223, 'duration': 5.803}, {'end': 3534.448, 'text': 'which will allow us to actually do some interesting things in terms of displaying certain links.', 'start': 3530.026, 'duration': 4.422}, {'end': 3542.652, 'text': 'For example, if they are a teacher, then you could add a create link here to display, which will allow them to create assignments.', 'start': 3534.868, 'duration': 7.784}], 'summary': 'Tutorial confirms user login and stores user id and type in local storage.', 'duration': 24.813, 'max_score': 3517.839, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo3517839.jpg'}], 'start': 2938.669, 'title': 'User authentication and local storage', 'summary': 'Covers configuring user login and local storage, emphasizing the need to save user data to display the username in the profile. it also explains creating a custom token serializer for user authentication, enabling successful user authentication and local storage of user details to enhance user experience and access control.', 'chapters': [{'end': 3020.293, 'start': 2938.669, 'title': 'Configuring user login and local storage', 'summary': 'Discusses configuring user login and local storage, emphasizing the need to save user data in local storage in order to display the username in the profile, and detailing the process of updating the auth login method to store user information.', 'duration': 81.624, 'highlights': ['The need to save user data in local storage in order to display the username in the profile', 'Updating the auth login method to store user information in local storage after receiving a response']}, {'end': 3596.843, 'start': 3021.254, 'title': 'Custom token serializer for user authentication', 'summary': 'Explains the process of creating a custom token serializer to receive user type and id in addition to the token, enabling successful user authentication and local storage of user details, with the goal of enhancing user experience and access control.', 'duration': 575.589, 'highlights': ['Creating a custom token serializer to receive user type and ID in addition to the token The custom token serializer is designed to return not only the key (token) from Django rest auth, but also the user type (student or teacher) and the user ID, facilitating enhanced user authentication and access control.', 'Storing user details in local storage for seamless user experience The successful login process ensures that the user details, including the user ID and type, are stored in the local storage, enabling a seamless user experience and access control.', 'Enabling conditional UI elements based on user type The custom token serializer and local storage of user details pave the way for conditional UI elements based on user type, such as displaying specific links or functionalities for teachers and students, enhancing the user experience and access control.']}], 'duration': 658.174, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo2938669.jpg', 'highlights': ['Creating a custom token serializer to receive user type and ID in addition to the token', 'Storing user details in local storage for seamless user experience', 'Enabling conditional UI elements based on user type', 'Updating the auth login method to store user information in local storage after receiving a response', 'The need to save user data in local storage in order to display the username in the profile']}, {'end': 5218.852, 'segs': [{'end': 3786.69, 'src': 'embed', 'start': 3761.483, 'weight': 1, 'content': [{'end': 3767.025, 'text': "So basically, this just means that we'll create a choice, and then assign those choices to each question.", 'start': 3761.483, 'duration': 5.542}, {'end': 3769.626, 'text': 'And so those are the basic models.', 'start': 3767.585, 'duration': 2.041}, {'end': 3773.407, 'text': "And what we're also going to create is a graded assignment.", 'start': 3770.766, 'duration': 2.641}, {'end': 3780.008, 'text': 'Now the graded assignment is kind of like an in between model between the assignment and the student.', 'start': 3773.867, 'duration': 6.141}, {'end': 3784.209, 'text': 'And the reason for this is we could just add a field here, which would be like graded.', 'start': 3780.529, 'duration': 3.68}, {'end': 3786.69, 'text': 'And this could be like a Boolean field.', 'start': 3784.61, 'duration': 2.08}], 'summary': 'Creating choices for questions and introducing a graded assignment model with a boolean field.', 'duration': 25.207, 'max_score': 3761.483, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo3761483.jpg'}, {'end': 3861.349, 'src': 'embed', 'start': 3828.091, 'weight': 0, 'content': [{'end': 3830.332, 'text': "Let's create these models, we'll get started with the assignment.", 'start': 3828.091, 'duration': 2.241}, {'end': 3834.834, 'text': "So we'll say class assignment, and it comes from models that model.", 'start': 3830.772, 'duration': 4.062}, {'end': 3838.515, 'text': "we'll say that the title is a character field.", 'start': 3836.434, 'duration': 2.081}, {'end': 3842.156, 'text': "And we'll just set the max length to be 50.", 'start': 3839.335, 'duration': 2.821}, {'end': 3848.139, 'text': "And we'll say that the teacher is a foreign key on the user model.", 'start': 3842.156, 'duration': 5.983}, {'end': 3850.32, 'text': 'And that means we need to import the user.', 'start': 3848.879, 'duration': 1.441}, {'end': 3855.102, 'text': "So we'll say from the users that models import user.", 'start': 3850.38, 'duration': 4.722}, {'end': 3861.349, 'text': 'And then we just need to specify the on delete, which will be models dot cascade.', 'start': 3856.343, 'duration': 5.006}], 'summary': 'Creating class assignment model with title as character field (max length 50) and teacher as foreign key on user model.', 'duration': 33.258, 'max_score': 3828.091, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo3828091.jpg'}, {'end': 4290.337, 'src': 'embed', 'start': 4258.543, 'weight': 2, 'content': [{'end': 4260.124, 'text': 'And everything is working.', 'start': 4258.543, 'duration': 1.581}, {'end': 4266.587, 'text': "So let's go actually to the local host to slash assignments.", 'start': 4260.324, 'duration': 6.263}, {'end': 4271.389, 'text': 'And we see that we get the default Django rest framework list for you.', 'start': 4267.707, 'duration': 3.682}, {'end': 4273.03, 'text': "And let's head into the admin.", 'start': 4271.969, 'duration': 1.061}, {'end': 4276.611, 'text': 'And we can actually add those models into the admin as well.', 'start': 4273.53, 'duration': 3.081}, {'end': 4284.974, 'text': "So we'll say from dot models, import the choice, question, assignment and graded assignment.", 'start': 4277.191, 'duration': 7.783}, {'end': 4290.337, 'text': "And then we'll just say admin dot site dot register each of these.", 'start': 4285.535, 'duration': 4.802}], 'summary': 'Configured django rest framework to display default list for assignments and added models to the admin interface.', 'duration': 31.794, 'max_score': 4258.543, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo4258543.jpg'}, {'end': 4533.788, 'src': 'embed', 'start': 4510.566, 'weight': 3, 'content': [{'end': 4518.373, 'text': "So we'll say this is get assignment list start, and get assignment list, success, and get assignment list fail.", 'start': 4510.566, 'duration': 7.807}, {'end': 4527.241, 'text': 'And now we just need to add the assignment or assignments rather, into the get assignment the success action.', 'start': 4519.214, 'duration': 8.027}, {'end': 4529.383, 'text': 'So we pass those assignments in there.', 'start': 4527.782, 'duration': 1.601}, {'end': 4533.788, 'text': 'And now we need to create our function to actually get those assignments.', 'start': 4529.924, 'duration': 3.864}], 'summary': 'Developing a function to retrieve assignments for success and failure', 'duration': 23.222, 'max_score': 4510.566, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo4510566.jpg'}, {'end': 5032.131, 'src': 'embed', 'start': 5001.409, 'weight': 4, 'content': [{'end': 5008.754, 'text': "So what I'm going to do is create a method here that will return each list item, but with a nav link inside it.", 'start': 5001.409, 'duration': 7.345}, {'end': 5013.937, 'text': 'So this will just be render item, and it will take an item.', 'start': 5009.114, 'duration': 4.823}, {'end': 5018.68, 'text': "And we'll just say return this here, but we'll import the nav link.", 'start': 5014.538, 'duration': 4.142}, {'end': 5025.185, 'text': "So we'll say import from react router DOM, which is nav link.", 'start': 5019.801, 'duration': 5.384}, {'end': 5028.688, 'text': 'And we will put that inside like that.', 'start': 5025.885, 'duration': 2.803}, {'end': 5032.131, 'text': 'And this is the link component.', 'start': 5030.109, 'duration': 2.022}], 'summary': 'Creating a method to return list items with a nav link inside, using the react router dom.', 'duration': 30.722, 'max_score': 5001.409, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5001409.jpg'}, {'end': 5133.297, 'src': 'embed', 'start': 5083.647, 'weight': 5, 'content': [{'end': 5087.91, 'text': 'So like if I click on assignment one, then you see it takes us to this link here.', 'start': 5083.647, 'duration': 4.263}, {'end': 5090.172, 'text': 'So we basically want to add a route to handle that.', 'start': 5088.051, 'duration': 2.121}, {'end': 5093.234, 'text': "So let's go back here to roots.", 'start': 5091.033, 'duration': 2.201}, {'end': 5099.658, 'text': "And we're going to just copy that one and say this is the assignment detail, which we'll create in a second.", 'start': 5094.535, 'duration': 5.123}, {'end': 5107.382, 'text': "And basically we're just going to copy this here and say when you go to assignments and then an ID,", 'start': 5100.298, 'duration': 7.084}, {'end': 5109.963, 'text': "then it's going to take you to the assignment detail.", 'start': 5107.382, 'duration': 2.581}, {'end': 5116.187, 'text': "And now we can come back into the containers and we'll add assignment detail.js.", 'start': 5110.584, 'duration': 5.603}, {'end': 5120.189, 'text': 'basically what we want to do in here is just create a card.', 'start': 5117.367, 'duration': 2.822}, {'end': 5132.456, 'text': 'so if we check out the cards here from and D which are here under the data display and we can just come down a little bit and see this one here which has an inner card,', 'start': 5120.189, 'duration': 12.267}, {'end': 5133.297, 'text': "that's quite nice.", 'start': 5132.456, 'duration': 0.841}], 'summary': 'Adding a route to handle assignment detail, creating a card for display.', 'duration': 49.65, 'max_score': 5083.647, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5083647.jpg'}], 'start': 3602.544, 'title': 'Django models, api setup, and react redux implementation', 'summary': 'Discusses creating django models for assignments and graded assignments, setting up api and url handling, configuring django rest framework and react redux, implementing redux for assignment list, and creating assignment detail page using react components.', 'chapters': [{'end': 4036.498, 'start': 3602.544, 'title': 'Creating django models for assignments and graded assignments', 'summary': 'Discusses the creation of django models for assignments, including the fields and relationships like title, teacher, questions, choices, and order, as well as the graded assignment model for students, assignments, and grades.', 'duration': 433.954, 'highlights': ['Creation of Django models for assignments, including fields like title, teacher, questions, choices, and order. The chapter discusses the creation of Django models for assignments, including the fields on an assignment such as title, teacher, questions, choices, and order.', 'Description of the graded assignment model for students, assignments, and grades. The chapter elaborates on the creation of the graded assignment model, which includes fields for the student who completed the assignment, the assignment completed, and the grade.', 'Explanation of the relationships between the models and their attributes. The transcript explains the relationships between the models and their attributes, such as creating a foreign key to reference the questions on each assignment and defining the related name for the answer field.']}, {'end': 4257.803, 'start': 4037.759, 'title': 'Setting up api and url handling', 'summary': 'Outlines the process of setting up api and url handling, including creating folders and urls for different view sets, importing and using serializers, and making migrations.', 'duration': 220.044, 'highlights': ["We make migrations and migrate to create models using 'manage.py make migrations' and 'manage.py migrate', respectively.", 'Creation of folders and URLs for assignment view set and graded assignment view set inside the API.', 'Importing and using serializers for assignment model to create a serializer file with an assignment serializer.']}, {'end': 4592.39, 'start': 4258.543, 'title': 'Configuring django rest framework and react redux', 'summary': 'Covers configuring django rest framework to handle models, registering models in the admin, creating and displaying assignments, integrating view sets in urls, and using react redux to handle data retrieval and display.', 'duration': 333.847, 'highlights': ['Configuring Django Rest Framework to handle models and registering them in the admin. Configuring Django Rest Framework, registering models in the admin', 'Creating and displaying assignments, integrating view sets in URLs. Creating assignments, displaying assignments, integrating view sets in URLs', 'Using React Redux to handle data retrieval and display. Using React Redux, data retrieval and display']}, {'end': 4975.711, 'start': 4593.63, 'title': 'Redux assignment list implementation', 'summary': 'Discusses the implementation of the assignment list feature using redux, including actions, reducers, and connecting the component to the store, aiming to fetch assignments using authentication tokens and displaying loading feedback.', 'duration': 382.081, 'highlights': ['Implementing get assignment list start, success, and fail actions, initializing assignments as an empty list, and setting action assignments to assignments in the reducer. get assignment list start, success, and fail actions', 'Connecting the assignment reducer to the root reducer and granting access to assignments via the assignments reducer. connection of the assignment reducer to the root reducer', 'Using React Redux to connect the assignment list to the store, defining map state to props and map dispatch to props, and passing the authentication token for fetching assignments. utilization of React Redux to connect the assignment list to the store, passing the authentication token', 'Incorporating loading feedback using the skeleton component from Ant Design, and dynamically rendering the data source based on the loading state. incorporation of loading feedback using the skeleton component from Ant Design', 'Implementing component lifecycle methods componentDidMount and componentWillReceiveProps to fetch assignments when the token is available and updated. implementation of component lifecycle methods componentDidMount and componentWillReceiveProps']}, {'end': 5218.852, 'start': 4976.032, 'title': 'Assignment detail page implementation', 'summary': 'Details the implementation of the assignment detail page, including creating a method to render list items with nav links, adding a route for assignment detail, and creating a card for the assignment detail page using react components.', 'duration': 242.82, 'highlights': ['Creating a method to render list items with nav links A method is created to return each list item with a nav link inside it, allowing for the display of assignment titles and teachers, enabling navigation within the assignment list.', 'Adding a route for assignment detail A route is added to handle the display of assignment details, enabling navigation to the assignment detail page based on the assignment ID.', 'Creating a card for the assignment detail page using React components A card for the assignment detail page is created using React components, with the ability to customize the display and potentially incorporate interactive question navigation.']}], 'duration': 1616.308, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo3602544.jpg', 'highlights': ['Creation of Django models for assignments, including fields like title, teacher, questions, choices, and order.', 'Description of the graded assignment model for students, assignments, and grades.', 'Configuring Django Rest Framework to handle models and registering them in the admin.', 'Implementing get assignment list start, success, and fail actions, initializing assignments as an empty list, and setting action assignments to assignments in the reducer.', 'Creating a method to render list items with nav links.', 'Adding a route for assignment detail.', 'Creating a card for the assignment detail page using React components.']}, {'end': 6956.673, 'segs': [{'end': 5326.262, 'src': 'embed', 'start': 5298.012, 'weight': 0, 'content': [{'end': 5300.073, 'text': 'And we also need to update our action types.', 'start': 5298.012, 'duration': 2.061}, {'end': 5307.516, 'text': 'So you can just do something like this get assignment detail start fail and success, same kind of concept as before.', 'start': 5301.474, 'duration': 6.042}, {'end': 5312.091, 'text': 'And then we just need to change this here for these methods.', 'start': 5309.125, 'duration': 2.966}, {'end': 5320.147, 'text': 'So this will be get assignment detail start, get assignment detail success, and get assignment detail fail.', 'start': 5312.131, 'duration': 8.016}, {'end': 5324.401, 'text': 'And everything is pretty much good to go.', 'start': 5321.698, 'duration': 2.703}, {'end': 5326.262, 'text': 'So we can actually close that.', 'start': 5324.981, 'duration': 1.281}], 'summary': 'Update action types to get assignment detail start, success, and fail.', 'duration': 28.25, 'max_score': 5298.012, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5298012.jpg'}, {'end': 5529.842, 'src': 'embed', 'start': 5502.979, 'weight': 1, 'content': [{'end': 5509.407, 'text': "we'll output this dynamically and say that this is the title which will come here and say constant.", 'start': 5502.979, 'duration': 6.428}, {'end': 5514.23, 'text': 'title equals to this dot props dot current assignment.', 'start': 5510.448, 'duration': 3.782}, {'end': 5517.873, 'text': "And if we come back, we're getting an unauthorized error.", 'start': 5514.851, 'duration': 3.022}, {'end': 5520.535, 'text': 'And that might be because of our settings.', 'start': 5518.293, 'duration': 2.242}, {'end': 5529.842, 'text': 'So if we go to home settings based up pi, and go all the way down here, and we can actually change this to be is authenticated.', 'start': 5520.675, 'duration': 9.167}], 'summary': 'The transcript discusses dynamically outputting a title and troubleshooting an unauthorized error in the settings.', 'duration': 26.863, 'max_score': 5502.979, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5502979.jpg'}, {'end': 5880.813, 'src': 'embed', 'start': 5850.999, 'weight': 5, 'content': [{'end': 5856.622, 'text': 'And what we can actually do is return a card by mapping through the questions.', 'start': 5850.999, 'duration': 5.623}, {'end': 5862.364, 'text': 'we can return a card for each question and pass basically a list of components into the questions.', 'start': 5856.622, 'duration': 5.742}, {'end': 5871.048, 'text': 'And that way, when it comes through in the questions here, the component that will render will not just be this over here, the start in the steps,', 'start': 5862.925, 'duration': 8.123}, {'end': 5872.249, 'text': "it'll actually be a component.", 'start': 5871.048, 'duration': 1.201}, {'end': 5874.35, 'text': "And so let's just see how this will be done.", 'start': 5872.549, 'duration': 1.801}, {'end': 5875.29, 'text': "We'll say dot map.", 'start': 5874.43, 'duration': 0.86}, {'end': 5880.813, 'text': "And we'll say for each question, we're going to return a card.", 'start': 5875.83, 'duration': 4.983}], 'summary': 'Return a card for each question by mapping through the questions and passing a list of components.', 'duration': 29.814, 'max_score': 5850.999, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5850999.jpg'}, {'end': 5990.565, 'src': 'embed', 'start': 5966.031, 'weight': 2, 'content': [{'end': 5971.654, 'text': "We're basically just creating a step, we can remove these class names, because we don't actually have the CSS for that.", 'start': 5966.031, 'duration': 5.623}, {'end': 5979.094, 'text': 'And this div here is rendering out what used to be steps of the current step.', 'start': 5973.308, 'duration': 5.786}, {'end': 5990.565, 'text': "But now we want to change steps to be questions so that it will render out the question according to the index of that question within the list of questions we've passed down.", 'start': 5979.995, 'duration': 10.57}], 'summary': 'Adapting code to render questions instead of steps based on index.', 'duration': 24.534, 'max_score': 5966.031, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5966031.jpg'}, {'end': 6035.604, 'src': 'embed', 'start': 6012.044, 'weight': 3, 'content': [{'end': 6019.251, 'text': "So let's jump back into the back end and go all the way to API, and then to serializers.", 'start': 6012.044, 'duration': 7.207}, {'end': 6028.118, 'text': 'Now, the issue is that we have a nested component questions are referenced by a foreign key in the question model.', 'start': 6020.232, 'duration': 7.886}, {'end': 6030.7, 'text': "And so that's why we're not seeing it come through.", 'start': 6028.959, 'duration': 1.741}, {'end': 6035.604, 'text': "And so we're going to actually do the same kind of thing as what we did in the users.", 'start': 6031.401, 'duration': 4.203}], 'summary': 'Troubleshooting nested component reference issue in api backend.', 'duration': 23.56, 'max_score': 6012.044, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6012044.jpg'}, {'end': 6253.063, 'src': 'embed', 'start': 6220.905, 'weight': 4, 'content': [{'end': 6227.888, 'text': 'And to basically get around this with a dirty trick, what we can do is go into our assignment detail.', 'start': 6220.905, 'duration': 6.983}, {'end': 6239.254, 'text': "And here right above the high order component, we'll just say object dot keys of the current assignment, and say dot length.", 'start': 6228.709, 'duration': 10.545}, {'end': 6244.536, 'text': 'And if it is greater than zero, then we will do all of this here.', 'start': 6239.994, 'duration': 4.542}, {'end': 6249.839, 'text': "So let's just cut all of that and bring it there.", 'start': 6245.197, 'duration': 4.642}, {'end': 6253.063, 'text': 'Otherwise, just return null.', 'start': 6251.12, 'duration': 1.943}], 'summary': 'Utilize object.keys to check assignment length and execute code accordingly.', 'duration': 32.158, 'max_score': 6220.905, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6220905.jpg'}, {'end': 6346.845, 'src': 'embed', 'start': 6322.949, 'weight': 6, 'content': [{'end': 6331.154, 'text': "it's going to return the actual text, the title of each choice instead, and the user will be returned by the username and not by the ID.", 'start': 6322.949, 'duration': 8.205}, {'end': 6333.776, 'text': 'And we can nail that pretty quickly.', 'start': 6331.375, 'duration': 2.401}, {'end': 6338.339, 'text': 'If we just go back to our serializer, we can use a string serializer.', 'start': 6334.417, 'duration': 3.922}, {'end': 6342.122, 'text': 'So we can just say class string serializer.', 'start': 6339, 'duration': 3.122}, {'end': 6346.845, 'text': 'and say this inherits from serializers dot string related field.', 'start': 6343.383, 'duration': 3.462}], 'summary': 'Returning text and title, using string serializer for quick implementation.', 'duration': 23.896, 'max_score': 6322.949, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6322949.jpg'}, {'end': 6401.763, 'src': 'embed', 'start': 6376.155, 'weight': 7, 'content': [{'end': 6384.229, 'text': 'So we can say choices equal to string serializer, where many equals true, because there are many choices for each question.', 'start': 6376.155, 'duration': 8.074}, {'end': 6388.432, 'text': 'And then we can return that here inside the fields.', 'start': 6384.989, 'duration': 3.443}, {'end': 6395.138, 'text': "And if you wanted to return the teachers, well, let's say you wanted to return the teachers name and put in the top right hand corner.", 'start': 6389.353, 'duration': 5.785}, {'end': 6401.763, 'text': 'then you could do the same thing and say teacher equals to string serializer where many equals false.', 'start': 6395.138, 'duration': 6.625}], 'summary': "Using string serializer, multiple choices can be returned for each question, while individual teachers' names can be displayed in the top right corner.", 'duration': 25.608, 'max_score': 6376.155, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6376155.jpg'}, {'end': 6574.193, 'src': 'embed', 'start': 6518.435, 'weight': 8, 'content': [{'end': 6521.417, 'text': "And we're going to take this component into the assignment detail.", 'start': 6518.435, 'duration': 2.982}, {'end': 6526.941, 'text': "And we'll say, import choices from components choices.", 'start': 6521.857, 'duration': 5.084}, {'end': 6533.263, 'text': 'what we want to do is render the choices inside the card right.', 'start': 6528.021, 'duration': 5.242}, {'end': 6533.943, 'text': 'that makes sense.', 'start': 6533.263, 'duration': 0.68}, {'end': 6546.667, 'text': "so we're passing the cards as components into the question, but each component card, but each card that we pass in has answers inside it.", 'start': 6533.943, 'duration': 12.724}, {'end': 6555.173, 'text': 'so if we go all the way down here to the card and we basically want to pass these choices inside it,', 'start': 6546.667, 'duration': 8.506}, {'end': 6557.295, 'text': "So like that, we'll say choices.", 'start': 6555.794, 'duration': 1.501}, {'end': 6560.519, 'text': "And we'll just do it like that for now.", 'start': 6557.916, 'duration': 2.603}, {'end': 6562.041, 'text': "And let's see what this looks like.", 'start': 6560.859, 'duration': 1.182}, {'end': 6566.546, 'text': 'And now you can see you get like option ABC for the questions.', 'start': 6562.641, 'duration': 3.905}, {'end': 6574.193, 'text': "And what we can also do is come up top here and just find some styling, which we'll just say is the card style.", 'start': 6567.407, 'duration': 6.786}], 'summary': 'Passing choices into card components for rendering. implementing card styling.', 'duration': 55.758, 'max_score': 6518.435, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6518435.jpg'}, {'end': 6655.906, 'src': 'embed', 'start': 6629.983, 'weight': 10, 'content': [{'end': 6637.791, 'text': "And if you go from next to the next one, you're going from question two, to question one, and back.", 'start': 6629.983, 'duration': 7.808}, {'end': 6638.992, 'text': "And that's pretty cool.", 'start': 6638.291, 'duration': 0.701}, {'end': 6649.202, 'text': 'So now all we need to do is just pass in the options, or that rather the choices of each question as the actual choices to this radio group here.', 'start': 6639.552, 'duration': 9.65}, {'end': 6655.906, 'text': "and so we already have the choices component that we're passing into the card.", 'start': 6650.383, 'duration': 5.523}], 'summary': 'Pass options for each question to the radio group component.', 'duration': 25.923, 'max_score': 6629.983, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6629983.jpg'}, {'end': 6790.677, 'src': 'embed', 'start': 6761.966, 'weight': 12, 'content': [{'end': 6764.267, 'text': "And that's very easy to update in the state.", 'start': 6761.966, 'duration': 2.301}, {'end': 6768.208, 'text': "So, basically, what we're doing is at the top here.", 'start': 6764.527, 'duration': 3.681}, {'end': 6775.391, 'text': "we're just going to say that the state equals to this object that has let's call it user answers, which is an object.", 'start': 6768.208, 'duration': 7.183}, {'end': 6783.994, 'text': "And then in the on change, we're not only going to take in an event, but we're going to take in the question ID that was changed.", 'start': 6776.111, 'duration': 7.883}, {'end': 6790.677, 'text': "And so we'll grab the users answers via the state, and say this equals to this dot state.", 'start': 6784.534, 'duration': 6.143}], 'summary': 'Updating state with user answers and question id in the on change event.', 'duration': 28.711, 'max_score': 6761.966, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6761966.jpg'}], 'start': 5219.373, 'title': 'Updating assignment detail handling, rendering step-by-step display of questions, serializing data for api, and creating radio group for questions', 'summary': 'Covers updating methods for handling assignment details, rendering step-by-step questions, serializing data for api, and creating a radio group for questions, resulting in successful integration and rendering with resolved errors.', 'chapters': [{'end': 5554.832, 'start': 5219.373, 'title': 'Updating assignment detail handling', 'summary': 'Focuses on updating the methods to handle getting assignment details by dispatching start, success, and fail actions, and integrating these methods into the assignment detail component, while also resolving an unauthorized error.', 'duration': 335.459, 'highlights': ['Updating methods to handle getting assignment details The chapter discusses updating the methods for getting assignment details by dispatching start, success, and fail actions, and integrating these methods into the assignment detail component.', 'Resolving unauthorized error The transcript details the resolution of an unauthorized error by adjusting settings and passing the token as a prop to resolve the error.']}, {'end': 6298.738, 'start': 5555.473, 'title': 'Rendering step-by-step display of questions', 'summary': 'Details the process of rendering a step-by-step display of questions, including creating a new component, passing props, handling serialization, and addressing undefined issues, resulting in successful rendering of the questions with proper data.', 'duration': 743.265, 'highlights': ["The process of rendering a step-by-step display of questions involves creating a new component called 'questions' to render the questions, renaming the app to 'questions', importing necessary components, and passing props to display questions. The transcript discusses creating a new component called 'questions' to render the step-by-step display of questions, renaming the app to 'questions', importing necessary components, and passing props to display the questions.", 'Handling serialization issues involved creating a nested serializer for questions, setting the related name for the foreign key, and using a dirty trick to check the length of keys in the current assignment object to address undefined issues and successfully render the questions. The process of handling serialization issues involved creating a nested serializer for questions, setting the related name for the foreign key, and using a dirty trick to check the length of keys in the current assignment object to address undefined issues and successfully render the questions.', 'Addressing undefined issues required checking the length of keys in the current assignment object and using conditional rendering to successfully display the questions. The transcript highlights the process of addressing undefined issues by checking the length of keys in the current assignment object and using conditional rendering to successfully display the questions.', 'Passing props to display the questions involved mapping through the questions and returning a card for each question, along with setting key and title attributes for proper rendering. The chapter discusses passing props to display the questions by mapping through the questions and returning a card for each question, along with setting key and title attributes for proper rendering.']}, {'end': 6601.746, 'start': 6299.639, 'title': 'Serializing data for api', 'summary': 'Discusses converting fields in serializers into strings, using string serializer to convert fields, adding choices for each question inside the question, and rendering choices inside the card.', 'duration': 302.107, 'highlights': ['Converting fields in serializers into strings The chapter discusses converting fields in serializers into strings, allowing for the return of specific data such as the title of each choice and the username of the user, represented quantifiably by returning the actual text and the username instead of the ID.', 'Using string serializer to convert fields The use of string serializer to convert fields in other serializers into strings is explained, with the example of converting choices into a string serializer, indicating many choices for each question.', 'Adding choices for each question inside the question The process of adding choices for each question inside the question is described, enabling the rendering of choices inside the card, allowing for the selection of different options for the questions.', 'Rendering choices inside the card The method of rendering choices inside the card is covered, with the addition of styling to improve the appearance and spacing of the options, resulting in a better visual representation and usability.']}, {'end': 6956.673, 'start': 6603.027, 'title': 'Creating radio group for questions', 'summary': 'Discusses creating a radio group for questions, passing question choices as props, and managing user answers using the state. it explains the process of mapping through choices and handling the on change event to update user answers.', 'duration': 353.646, 'highlights': ['The chapter discusses creating a radio group for questions It explains the process of mapping through choices and handling the on change event to update user answers.', 'Passing question choices as props The chapter explains how to pass the choices of each question as props to the radio group component.', 'Managing user answers using the state It details the process of managing user answers by storing them in the state and updating them using the on change event.']}], 'duration': 1737.3, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo5219373.jpg', 'highlights': ['Updating methods to handle getting assignment details by dispatching start, success, and fail actions', 'Resolving unauthorized error by adjusting settings and passing the token as a prop', "Creating a new component called 'questions' to render the step-by-step display of questions", 'Handling serialization issues by creating a nested serializer for questions and setting the related name for the foreign key', 'Addressing undefined issues by checking the length of keys in the current assignment object and using conditional rendering', 'Passing props to display the questions by mapping through the questions and returning a card for each question', 'Converting fields in serializers into strings to return specific data such as the title of each choice and the username of the user', 'Using string serializer to convert fields in other serializers into strings, with the example of converting choices into a string serializer', 'Adding choices for each question inside the question to enable the rendering of choices inside the card', 'Rendering choices inside the card with the addition of styling to improve the appearance and spacing of the options', 'Creating a radio group for questions by mapping through choices and handling the on change event to update user answers', 'Passing question choices as props to the radio group component', 'Managing user answers by storing them in the state and updating them using the on change event']}, {'end': 9150.724, 'segs': [{'end': 7125.867, 'src': 'embed', 'start': 7099.727, 'weight': 1, 'content': [{'end': 7104.23, 'text': "So basically, we'll submit the users answers to each question.", 'start': 7099.727, 'duration': 4.503}, {'end': 7114.736, 'text': "And then on the server we'll evaluate whether the answer they selected was the correct answer and then create a graded assignment object which will hold the grade of that user's assignment.", 'start': 7104.35, 'duration': 10.386}, {'end': 7116.597, 'text': "So we'll get to that in a second.", 'start': 7115.456, 'duration': 1.141}, {'end': 7121.783, 'text': 'But what we actually want to do first is handle the form that will allow us to create assignments.', 'start': 7116.617, 'duration': 5.166}, {'end': 7125.867, 'text': 'And this will only be allowed for users that are teachers.', 'start': 7122.344, 'duration': 3.523}], 'summary': 'Evaluate user answers, create graded assignment object, and handle form for creating assignments for teachers.', 'duration': 26.14, 'max_score': 7099.727, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo7099727.jpg'}, {'end': 7574.943, 'src': 'heatmap', 'start': 7444.544, 'weight': 1, 'content': [{'end': 7451.805, 'text': "we can actually pretty much copy everything in this file and paste it in the question form, and then we'll just rename everything here.", 'start': 7444.544, 'duration': 7.261}, {'end': 7455.106, 'text': 'so this will be wrapped question form.', 'start': 7451.805, 'duration': 3.301}, {'end': 7461.188, 'text': "And in fact, actually we're not even going to create a form using and D,", 'start': 7456.346, 'duration': 4.842}, {'end': 7469.892, 'text': "because what we're going to do is rather create form items and then pass those formal items inside the general form that we have here.", 'start': 7461.188, 'duration': 8.704}, {'end': 7476.575, 'text': 'So inside this form, and so instead, we can get rid of that call there.', 'start': 7470.632, 'duration': 5.943}, {'end': 7478.715, 'text': "And we'll just call this the question form.", 'start': 7476.795, 'duration': 1.92}, {'end': 7481.637, 'text': 'And then this is the class question form.', 'start': 7479.476, 'duration': 2.161}, {'end': 7488.142, 'text': 'And so everything here is pretty much going to remain the same, we can actually make this a little bit shorter.', 'start': 7482.677, 'duration': 5.465}, {'end': 7493.907, 'text': 'And so each question form will manage the keys of that form.', 'start': 7490.184, 'duration': 3.723}, {'end': 7501.514, 'text': "Whereas the handle submit, we're not going to handle on the question form that will rather be on the assignment create view.", 'start': 7494.628, 'duration': 6.886}, {'end': 7502.735, 'text': 'So we can get rid of that.', 'start': 7501.614, 'duration': 1.121}, {'end': 7505.257, 'text': 'And now we have the render method.', 'start': 7503.756, 'duration': 1.501}, {'end': 7512.462, 'text': 'And so the label of this form item will not be the passengers, but instead, this will be the choices.', 'start': 7505.757, 'duration': 6.705}, {'end': 7518.866, 'text': "So inside the question form, we'll manage the choices of each question.", 'start': 7513.242, 'duration': 5.624}, {'end': 7526.652, 'text': 'And in the assignment, create form, if we just scroll up, passengers will rather be question.', 'start': 7519.427, 'duration': 7.225}, {'end': 7534.657, 'text': "And so let's actually go into the assignment creates and think about the form items that we want to have inside the main form.", 'start': 7527.532, 'duration': 7.125}, {'end': 7540.562, 'text': "So we're going to have this button, which will allow us to add a question.", 'start': 7535.358, 'duration': 5.204}, {'end': 7543.344, 'text': "So let's rather make this add question.", 'start': 7541.142, 'duration': 2.202}, {'end': 7545.805, 'text': 'And this will be the submit button.', 'start': 7544.124, 'duration': 1.681}, {'end': 7550.388, 'text': "But instead of making this a dash, we'll make this type secondary.", 'start': 7546.866, 'duration': 3.522}, {'end': 7554.03, 'text': "And we'll actually get rid of the width style.", 'start': 7551.069, 'duration': 2.961}, {'end': 7559.854, 'text': "And if we take a look at this, now you've got add question and submit there.", 'start': 7555.131, 'duration': 4.723}, {'end': 7564.397, 'text': 'And what we also want is a field to pass in the title of the assignment.', 'start': 7560.655, 'duration': 3.742}, {'end': 7568.019, 'text': "So we'll just create another form item here.", 'start': 7565.097, 'duration': 2.922}, {'end': 7574.943, 'text': "And we'll set the label of this form item equal to something like title.", 'start': 7568.039, 'duration': 6.904}], 'summary': 'Refactoring form structure to manage questions and choices for assignment creation.', 'duration': 130.399, 'max_score': 7444.544, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo7444544.jpg'}, {'end': 8279.837, 'src': 'embed', 'start': 8252.23, 'weight': 2, 'content': [{'end': 8257.995, 'text': "And so to kind of help differentiate the forms from each other, we'll just add a divide between them.", 'start': 8252.23, 'duration': 5.765}, {'end': 8260.236, 'text': "So let's go back to the answer create.", 'start': 8258.254, 'duration': 1.982}, {'end': 8267.282, 'text': "And we'll wrap this around with an HOC, which will actually need to import.", 'start': 8260.837, 'duration': 6.445}, {'end': 8272.627, 'text': "So we'll say import HOC from HOC.", 'start': 8267.343, 'duration': 5.284}, {'end': 8276.751, 'text': 'And then here, we will wrap this around like that.', 'start': 8274.228, 'duration': 2.523}, {'end': 8279.837, 'text': "And then we'll pass in a divide.", 'start': 8278.456, 'duration': 1.381}], 'summary': 'Differentiate forms using hoc and add a divide.', 'duration': 27.607, 'max_score': 8252.23, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo8252230.jpg'}, {'end': 8522.267, 'src': 'embed', 'start': 8492.467, 'weight': 4, 'content': [{'end': 8497.251, 'text': "And so let's go and add the functionality inside the submit method here.", 'start': 8492.467, 'duration': 4.784}, {'end': 8499.253, 'text': "So here you've got handle submit.", 'start': 8497.952, 'duration': 1.301}, {'end': 8505.497, 'text': 'And so basically, the format of how we want to submit this is going to be an assignment object.', 'start': 8499.973, 'duration': 5.524}, {'end': 8509.019, 'text': "So we'll say the assignment equals to an object.", 'start': 8505.717, 'duration': 3.302}, {'end': 8515.743, 'text': "And it's going to have a teacher, right? Because we know when we create an assignment, it has to have a teacher, and it has to have a title.", 'start': 8509.519, 'duration': 6.224}, {'end': 8522.267, 'text': 'So those are two easy properties, the title just simply comes from values dot title.', 'start': 8516.544, 'duration': 5.723}], 'summary': 'Adding functionality to submit method with assignment object containing teacher and title properties.', 'duration': 29.8, 'max_score': 8492.467, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo8492467.jpg'}, {'end': 8779.057, 'src': 'embed', 'start': 8749.813, 'weight': 0, 'content': [{'end': 8752.296, 'text': "And we've passed those questions into the assignment.", 'start': 8749.813, 'duration': 2.483}, {'end': 8760.646, 'text': 'And now we just need to create the actions in the store to handle the logic of pushing that to the server.', 'start': 8753.297, 'duration': 7.349}, {'end': 8762.668, 'text': "So let's go and do that.", 'start': 8761.687, 'duration': 0.981}, {'end': 8766.31, 'text': "Now we'll go and go into the store here into assignments.", 'start': 8762.728, 'duration': 3.582}, {'end': 8768.551, 'text': 'And all the way at the bottom.', 'start': 8767.53, 'duration': 1.021}, {'end': 8775.275, 'text': "here we're going to need to actually just basically copy all of this again and change this to be the assignment create logic.", 'start': 8768.551, 'duration': 6.724}, {'end': 8779.057, 'text': 'So this will just call create assignment start.', 'start': 8775.655, 'duration': 3.402}], 'summary': 'Creating actions in the store to handle assignment logic.', 'duration': 29.244, 'max_score': 8749.813, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo8749813.jpg'}, {'end': 8835.943, 'src': 'embed', 'start': 8813.226, 'weight': 3, 'content': [{'end': 8821.612, 'text': "And then here, we don't need to console that out, we can just say, dispatch, create assignment success, and create assignment fail.", 'start': 8813.226, 'duration': 8.386}, {'end': 8829.838, 'text': "And we're going to need to change this to be a post request, where we'll post it just to this URL, because it does handle post requests.", 'start': 8822.693, 'duration': 7.145}, {'end': 8832.5, 'text': "And we're not going to get anything back from the response.", 'start': 8830.479, 'duration': 2.021}, {'end': 8835.943, 'text': "we're just going to basically just dispatch the create assignment.", 'start': 8832.5, 'duration': 3.443}], 'summary': 'Changing to post request for dispatching create assignment.', 'duration': 22.717, 'max_score': 8813.226, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo8813226.jpg'}], 'start': 6957.754, 'title': 'Handling form and assignment creation logic', 'summary': 'Illustrates preserving states of questions, handling form for creating and grading assignments, differentiating field decorators, and modifying form components, emphasizing adding questions, managing assignments, and creating actions in the store.', 'chapters': [{'end': 7048.068, 'start': 6957.754, 'title': 'Preserving state in questionnaire', 'summary': 'Illustrates the process of preserving the states of questions in a questionnaire, emphasizing the flexibility of adding questions in the back end and highlighting the seamless navigation within the repository.', 'duration': 90.314, 'highlights': ['The process demonstrates preserving the states of questions in a questionnaire, ensuring that the selected answers are retained when navigating back and forth, providing a seamless user experience.', 'The flexibility of adding questions in the back end is emphasized, as the number of questions added does not impact the functionality, ensuring efficient handling of various question volumes.', "The tutorial encourages following along by accessing the 'teach me Django' repository on GitHub, specifically navigating to the third commit, which adds the assignment list and detail views."]}, {'end': 7993.234, 'start': 7048.068, 'title': 'Handling form for creating and grading assignments', 'summary': 'Covers adding a form to create assignments, handling graded assignments, and managing questions within the form for teachers, including elements such as adding and removing fields, managing the number of questions, and specifying the correct answer.', 'duration': 945.166, 'highlights': ['Adding a form to create assignments and handling graded assignments The tutorial covers adding a form to create assignments and handling graded assignments for users, including evaluating correct answers and creating a graded assignment object.', 'Managing questions within the form for teachers The chapter discusses managing questions within the form for teachers, including adding and removing fields, managing the number of questions, and specifying the correct answer.', 'Implementing functionality to add and remove fields in the form The tutorial explains the implementation of functionality to add and remove fields in the form for creating assignments, allowing teachers to customize the form.']}, {'end': 8251.068, 'start': 7993.854, 'title': 'Field decorator differentiation', 'summary': 'Discusses the need to differentiate question forms by using unique get field decorators to prevent setting the same value for multiple questions, and demonstrates this by passing question ids and using square brackets to access elements by index.', 'duration': 257.214, 'highlights': ['Unique get field decorators are essential to prevent setting the same value for multiple questions. It is crucial to ensure that every question form has a unique get field decorator to avoid setting the same value for multiple questions, as demonstrated by rendering five question forms with the same get field decorator.', 'Passing question IDs and using square brackets to access elements by index helps differentiate each question form from the next one. The approach of passing question IDs and using square brackets to access elements by index allows for the differentiation of each question form, addressing the issue of setting the same value for multiple questions.', 'The form component for the actual answer to the question is set as an input with a placeholder for the answer choice. The form component for the actual answer to the question is specified as an input with a placeholder for the answer choice, ensuring the accurate input of choices for each question.']}, {'end': 8749.313, 'start': 8252.23, 'title': 'Form component modifications', 'summary': 'Covers modifying a form component by adding a divide, wrapping it with a higher order component, adding an icon to remove a question, fixing issues with choices, and preparing the data format for submission, ultimately creating an assignment object with teacher, title, and questions.', 'duration': 497.083, 'highlights': ['Creating an assignment object with teacher, title, and questions The chapter concludes by preparing the data format for submission, creating an assignment object with properties like teacher, title, and questions, which include the title, choices, and answer for each question.', 'Adding a divide and wrapping the form with a higher order component The process involves adding a divide between form components and wrapping the form with a higher order component, importing the necessary component, and passing in the divide.', 'Fixing issues with choices and removing questions The chapter addresses issues with the choices in the form component, ensuring unique values by fixing a problem with the get field decorator. Additionally, an icon is added to remove questions, and functionality is implemented to handle the removal of questions.']}, {'end': 9150.724, 'start': 8749.813, 'title': 'Handling assignment creation logic', 'summary': 'Discusses the process of creating actions in the store to handle the logic of pushing assignments to the server, including dispatching success and fail actions, handling post requests, and overriding methods in the django rest framework api.', 'duration': 400.911, 'highlights': ['The process of creating actions in the store to handle the logic of pushing assignments to the server is discussed, including dispatching success and fail actions. The process of creating actions in the store to handle the logic of pushing assignments to the server is explained, involving dispatching success and fail actions such as create assignment start, create assignment success, and create assignment fail.', 'The process of handling post requests and dispatching success or fail actions based on the response from the server is detailed. The process of handling post requests and dispatching success or fail actions based on the response from the server is elaborated, with the dispatching of create assignment success and create assignment fail actions based on the server response.', 'Overriding methods in the Django rest framework API to handle assignment creation is explained. The process of overriding methods in the Django rest framework API to handle assignment creation is described, including the use of the assignment serializer to convert JSON into an object and return an HTTP 201 status for successful creation or an HTTP 400 status for a bad request.']}], 'duration': 2192.97, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo6957754.jpg', 'highlights': ['The process of creating actions in the store to handle the logic of pushing assignments to the server is discussed, including dispatching success and fail actions.', 'Adding a form to create assignments and handling graded assignments The tutorial covers adding a form to create assignments and handling graded assignments for users, including evaluating correct answers and creating a graded assignment object.', 'The process involves adding a divide between form components and wrapping the form with a higher order component, importing the necessary component, and passing in the divide.', 'The process of handling post requests and dispatching success or fail actions based on the response from the server is detailed.', 'Creating an assignment object with teacher, title, and questions The chapter concludes by preparing the data format for submission, creating an assignment object with properties like teacher, title, and questions, which include the title, choices, and answer for each question.']}, {'end': 10606.161, 'segs': [{'end': 9175.873, 'src': 'embed', 'start': 9151.385, 'weight': 0, 'content': [{'end': 9158.007, 'text': 'Cool So this assignment serializer dot create, this is a method on the serializer.', 'start': 9151.385, 'duration': 6.622}, {'end': 9162.268, 'text': 'So if you come here to the serializer, we can actually define that create method.', 'start': 9158.367, 'duration': 3.901}, {'end': 9164.889, 'text': "And that's going to be quite handy,", 'start': 9162.688, 'duration': 2.201}, {'end': 9172.492, 'text': "because the data that we're getting in in the serializer is really just not going to match what the serializer is expecting.", 'start': 9164.889, 'duration': 7.603}, {'end': 9175.873, 'text': "So we're going to override the create method on the serializer.", 'start': 9173.032, 'duration': 2.841}], 'summary': "The 'serializer.create' method is overridden to handle mismatched data input.", 'duration': 24.488, 'max_score': 9151.385, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo9151385.jpg'}, {'end': 9478.375, 'src': 'embed', 'start': 9450.824, 'weight': 1, 'content': [{'end': 9455.126, 'text': "And if we come back and click Submit, it seems we've got an error connection refused.", 'start': 9450.824, 'duration': 4.302}, {'end': 9456.386, 'text': "So let's see why that is.", 'start': 9455.206, 'duration': 1.18}, {'end': 9459.287, 'text': "We see we've got from user dot model.", 'start': 9457.587, 'duration': 1.7}, {'end': 9461.568, 'text': 'So this is meant to be from users.', 'start': 9459.327, 'duration': 2.241}, {'end': 9463.529, 'text': "And let's try that again.", 'start': 9462.729, 'duration': 0.8}, {'end': 9464.889, 'text': 'Click Submit.', 'start': 9464.049, 'duration': 0.84}, {'end': 9468.211, 'text': 'And this time we get a 401 unauthorized.', 'start': 9465.99, 'duration': 2.221}, {'end': 9470.452, 'text': "And that's because we're not logged in.", 'start': 9469.171, 'duration': 1.281}, {'end': 9471.412, 'text': "So we'll just log in.", 'start': 9470.472, 'duration': 0.94}, {'end': 9474.633, 'text': 'And we actually might just need to refresh the page here.', 'start': 9472.212, 'duration': 2.421}, {'end': 9476.514, 'text': "So we'll log in again.", 'start': 9475.013, 'duration': 1.501}, {'end': 9478.375, 'text': "And let's click on create.", 'start': 9477.354, 'duration': 1.021}], 'summary': 'Encountered errors: connection refused, 401 unauthorized. logged out and logged in again.', 'duration': 27.551, 'max_score': 9450.824, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo9450824.jpg'}, {'end': 9745.956, 'src': 'embed', 'start': 9713.074, 'weight': 2, 'content': [{'end': 9716.815, 'text': 'And the bottom line is that we were able to get this form to work.', 'start': 9713.074, 'duration': 3.741}, {'end': 9725.918, 'text': 'So now you can create these assignments here on the front end and see them in this list display, meaning that they are created in the back end.', 'start': 9716.855, 'duration': 9.063}, {'end': 9732.166, 'text': "So now we're able to create assignments.", 'start': 9730.345, 'duration': 1.821}, {'end': 9738.11, 'text': 'And what we want to do to finish off is to add some functionality to create a graded assignment.', 'start': 9732.446, 'duration': 5.664}, {'end': 9745.956, 'text': 'So if we take a look at the API models, we originally created these four models, and one of them is the graded assignment.', 'start': 9738.25, 'duration': 7.706}], 'summary': 'Successfully enabled front-end assignment creation and display, now working on adding functionality for graded assignments.', 'duration': 32.882, 'max_score': 9713.074, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo9713074.jpg'}, {'end': 9837.996, 'src': 'embed', 'start': 9809.104, 'weight': 5, 'content': [{'end': 9820.693, 'text': "And so what we'll just do is come to the bottom here after the view set, and we'll just create a class and call this the graded assignment list view.", 'start': 9809.104, 'duration': 11.589}, {'end': 9826.508, 'text': "And we're going to import from Django's generics to handle that.", 'start': 9822.745, 'duration': 3.763}, {'end': 9833.312, 'text': "So we'll say from the rest framework dot generics, import the list API view.", 'start': 9826.608, 'duration': 6.704}, {'end': 9837.996, 'text': "So we'll inherit from that list API view here.", 'start': 9834.073, 'duration': 3.923}], 'summary': "Creating 'graded assignment list view' class, inheriting from django's generics.", 'duration': 28.892, 'max_score': 9809.104, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo9809104.jpg'}, {'end': 10215.106, 'src': 'embed', 'start': 10182.017, 'weight': 4, 'content': [{'end': 10188.241, 'text': 'And now we just need to pass in the data source as the information that we get as the data we get from the back end.', 'start': 10182.017, 'duration': 6.224}, {'end': 10192.264, 'text': "So we're going to go and create a new reducer to handle all of that.", 'start': 10188.981, 'duration': 3.283}, {'end': 10201.311, 'text': "So inside the store, we've got the assignments, and we'll just create another one here, which will be the graded assignments.js.", 'start': 10192.944, 'duration': 8.367}, {'end': 10205.594, 'text': "And it's going to be similar to the assignments that we have here already.", 'start': 10202.832, 'duration': 2.762}, {'end': 10215.106, 'text': "So I'm just going to get everything from the get assignment list and paste that all in there.", 'start': 10205.614, 'duration': 9.492}], 'summary': "Creating a new reducer 'graded assignments.js' similar to 'assignments' to handle data from the back end.", 'duration': 33.089, 'max_score': 10182.017, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo10182017.jpg'}], 'start': 9151.385, 'title': 'Creating graded assignments', 'summary': "Details the process of creating graded assignments, including implementing the front end form, handling the back end logic, and displaying the assignments on the user's profile, leveraging django rest framework and generics.", 'chapters': [{'end': 9630.071, 'start': 9151.385, 'title': 'Serializer create method', 'summary': "Discusses the process of creating a 'create' method on a serializer, which involves handling and processing incoming data to create and assign objects such as choices, questions, and assignments, and addresses challenges such as error handling and data validation.", 'duration': 478.686, 'highlights': ["The process of creating a 'create' method on a serializer involves handling and processing incoming data to create and assign objects such as choices, questions, and assignments. The create method on the serializer is used to process incoming data to create and assign objects such as choices, questions, and assignments, and handle the mismatch between the incoming data and the serializer's expected format.", "Challenges in the process include error handling and data validation, such as addressing issues like 'connection refused', '401 unauthorized', and '500 error' related to null constraints and multiple choices. Challenges in the process include error handling and data validation, such as addressing issues like 'connection refused', '401 unauthorized', and '500 error' related to null constraints and multiple choices, and implementing temporary fixes to address these issues.", 'The method involves creating and assigning objects like choices, questions, and assignments, and handling challenges such as error handling and data validation. The method involves creating and assigning objects like choices, questions, and assignments, and addressing challenges such as error handling and data validation, to ensure successful processing and creation of objects.']}, {'end': 10069.145, 'start': 9630.532, 'title': 'Creating graded assignments', 'summary': "Details the process of creating graded assignments, including implementing the front end form, handling the back end logic, and displaying the assignments on the user's profile, leveraging django rest framework and generics.", 'duration': 438.613, 'highlights': ['Creating front end forms and fixing navigation errors The speaker demonstrates creating and fixing front end forms, ensuring proper navigation and functionality for creating assignments.', "Implementing graded assignment functionality in the back end and displaying on user profile The chapter emphasizes the process of handling graded assignments in the back end and displaying them on the user's profile, enhancing the overall functionality of the system.", 'Utilizing Django REST framework and generics for creating graded assignment list view The speaker explains the use of Django REST framework and generics to create a graded assignment list view, showcasing the technical implementation of the feature.']}, {'end': 10606.161, 'start': 10070.126, 'title': 'Implementing progress component for graded assignments', 'summary': 'Covers the implementation of a progress component for graded assignments, including creating reducers, actions, and connecting components, to display the graded assignments with their respective grades and loading status.', 'duration': 536.035, 'highlights': ['Creating reducers and actions for handling graded assignments data, including defining action types such as get graded assignment list start, fail, and success, and dispatching appropriate methods for fetching graded assignments.', 'Connecting components to display graded assignments with their respective grades and loading status, including passing the graded assignments as the data source and using high order components and conditional rendering to manage the loading status.', 'Importing and using a progress component, specifically the mini circular progress bar, to display the progress of graded assignments, with the percentage based on the grade passed into the component.']}], 'duration': 1454.776, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo9151385.jpg', 'highlights': ["The process of creating a 'create' method on a serializer involves handling and processing incoming data to create and assign objects such as choices, questions, and assignments.", "Challenges in the process include error handling and data validation, such as addressing issues like 'connection refused', '401 unauthorized', and '500 error' related to null constraints and multiple choices.", 'Creating front end forms and fixing navigation errors The speaker demonstrates creating and fixing front end forms, ensuring proper navigation and functionality for creating assignments.', "Implementing graded assignment functionality in the back end and displaying on user profile The chapter emphasizes the process of handling graded assignments in the back end and displaying them on the user's profile, enhancing the overall functionality of the system.", 'Creating reducers and actions for handling graded assignments data, including defining action types such as get graded assignment list start, fail, and success, and dispatching appropriate methods for fetching graded assignments.', 'Utilizing Django REST framework and generics for creating graded assignment list view The speaker explains the use of Django REST framework and generics to create a graded assignment list view, showcasing the technical implementation of the feature.']}, {'end': 11827.758, 'segs': [{'end': 10692.734, 'src': 'embed', 'start': 10663.78, 'weight': 3, 'content': [{'end': 10668.224, 'text': 'So what you can say is define get query set.', 'start': 10663.78, 'duration': 4.444}, {'end': 10671.518, 'text': 'And this just takes in self.', 'start': 10670.157, 'duration': 1.361}, {'end': 10677.142, 'text': "And then we'll start off by saying that the query set is equal to all the objects.", 'start': 10672.659, 'duration': 4.483}, {'end': 10681.686, 'text': 'But then we will get the username from the URL.', 'start': 10677.763, 'duration': 3.923}, {'end': 10686.71, 'text': "So, basically, what we'll do is we'll query instead of graded assignment.", 'start': 10681.866, 'duration': 4.844}, {'end': 10690.533, 'text': "let's just find this here in our actions.", 'start': 10686.71, 'duration': 3.823}, {'end': 10692.734, 'text': 'instead of creating it like this.', 'start': 10690.533, 'duration': 2.201}], 'summary': 'Defining a get query set method, setting query set to all objects, and querying instead of creating a graded assignment.', 'duration': 28.954, 'max_score': 10663.78, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo10663780.jpg'}, {'end': 10823.301, 'src': 'embed', 'start': 10796.161, 'weight': 2, 'content': [{'end': 10799.303, 'text': 'And this is going to be inside the the questions.', 'start': 10796.161, 'duration': 3.142}, {'end': 10801.865, 'text': "So let's go to containers questions.", 'start': 10799.463, 'duration': 2.402}, {'end': 10805.708, 'text': 'And then this will just be submit like that.', 'start': 10802.626, 'duration': 3.082}, {'end': 10808.57, 'text': 'And if you click Next, now the button says Submit.', 'start': 10806.689, 'duration': 1.881}, {'end': 10813.334, 'text': 'And when you click Submit, it will process this in the back end.', 'start': 10808.611, 'duration': 4.723}, {'end': 10823.301, 'text': "So let's also instead of saying message success, like that, what we can do is just handle this here, we'll say, handle, submit.", 'start': 10813.594, 'duration': 9.707}], 'summary': 'The transcript discusses submitting and handling container questions in the backend.', 'duration': 27.14, 'max_score': 10796.161, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo10796161.jpg'}, {'end': 11324.62, 'src': 'embed', 'start': 11295.051, 'weight': 0, 'content': [{'end': 11300.275, 'text': "However, we're not getting the username, which is the stock props dot username.", 'start': 11295.051, 'duration': 5.224}, {'end': 11310.227, 'text': "So if we come down here, let's just add that one in there username is state dot auth dot username.", 'start': 11300.295, 'duration': 9.932}, {'end': 11319.658, 'text': "now, if we come back here, we'll submit it again, and if we come back here now, we've got the username coming through there,", 'start': 11310.227, 'duration': 9.431}, {'end': 11324.62, 'text': "And so let's try and handle this in the create method now.", 'start': 11321.238, 'duration': 3.382}], 'summary': 'Username data is successfully retrieved and handled in the create method.', 'duration': 29.569, 'max_score': 11295.051, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo11295051.jpg'}, {'end': 11417.772, 'src': 'embed', 'start': 11384.437, 'weight': 4, 'content': [{'end': 11390.14, 'text': 'We also want to assign the student equal to the student that we grabbed here as well.', 'start': 11384.437, 'duration': 5.703}, {'end': 11391.461, 'text': 'And now, basically,', 'start': 11390.82, 'duration': 0.641}, {'end': 11407.55, 'text': "we want to compare each questions answers to the answer that the user selected and basically just store like a like a count of how many they've gotten right and then compute how many they got right as a percentage of how many questions they were and assign that as the grade.", 'start': 11391.461, 'duration': 16.089}, {'end': 11417.772, 'text': "So what I'm going to do is say that the questions equals to a list of questions for all the questions in the assignment.", 'start': 11408.49, 'duration': 9.282}], 'summary': 'Comparing student answers to questions and computing percentage for grading.', 'duration': 33.335, 'max_score': 11384.437, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo11384437.jpg'}, {'end': 11776.438, 'src': 'embed', 'start': 11750.628, 'weight': 1, 'content': [{'end': 11756.255, 'text': 'to actually get that data in the front end store, everything with authentication to create assignments.', 'start': 11750.628, 'duration': 5.627}, {'end': 11762.462, 'text': "And I know we're not adding too many validation checks to see if the user actually is a teacher or not.", 'start': 11756.715, 'duration': 5.747}, {'end': 11766.166, 'text': 'But those are small things that you can add in to complete everything.', 'start': 11762.502, 'duration': 3.664}, {'end': 11770.872, 'text': 'And then lastly, we added the functionality to create a graded assignment, which is very cool.', 'start': 11766.186, 'duration': 4.686}, {'end': 11773.575, 'text': 'So all you do is just fill in the answers to the assignment.', 'start': 11771.452, 'duration': 2.123}, {'end': 11776.438, 'text': 'And there you go, it creates the graded assignment for you.', 'start': 11773.755, 'duration': 2.683}], 'summary': 'Developed front-end store with authentication, added validation checks, and created functionality for graded assignments.', 'duration': 25.81, 'max_score': 11750.628, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo11750628.jpg'}, {'end': 11809.723, 'src': 'embed', 'start': 11787.21, 'weight': 6, 'content': [{'end': 11795.014, 'text': "it's more to show you how you can create the different users and get that data across into the front end, because that's really the biggest effort is.", 'start': 11787.21, 'duration': 7.804}, {'end': 11800.637, 'text': "it's in learning how to customize those serializers, learning the methods that you can override,", 'start': 11795.014, 'duration': 5.623}, {'end': 11804.779, 'text': 'and it gets really tricky when you have nested relationships and foreign keys.', 'start': 11800.637, 'duration': 4.142}, {'end': 11809.723, 'text': "So learning about serializers can actually be quite beneficial, as we've seen.", 'start': 11805.479, 'duration': 4.244}], 'summary': 'Learning about customizing serializers and handling nested relationships can be quite beneficial.', 'duration': 22.513, 'max_score': 11787.21, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo11787210.jpg'}], 'start': 10607.542, 'title': 'Updating assignment submission and creating graded assignments', 'summary': 'Covers filtering graded assignments in the api view, updating the assignment submission process, creating a graded assignment api view, creating graded assignments in python, and user validation. it includes modifying the query set to retrieve completed assignments, handling submission logic, and creating graded assignments. the process involves setting up and overriding methods for a graded assignment create view, retrieving user data, calculating grades, and fixing user validation issues to enable successful submission and display of graded assignments.', 'chapters': [{'end': 10771.963, 'start': 10607.542, 'title': 'Filtering graded assignments in api view', 'summary': 'Explains the process of filtering graded assignments in the api view by modifying the query set to retrieve only the assignments completed by the user, illustrated by dynamically querying the username and filtering the query set accordingly.', 'duration': 164.421, 'highlights': ['The query set in the graded assignment list view initially returns all graded assignments for every user, requiring modification to filter assignments completed by the specific user, improving efficiency by only retrieving relevant data.', "The process involves defining a 'get query set' method, dynamically querying the username from the URL, and filtering the query set based on the user's username, ensuring that only relevant assignments are returned to the user.", "The demonstration showcases the successful implementation of the filtering process, as evidenced by the retrieval of the specific user's graded assignment after the modification, ensuring the functionality is working as intended."]}, {'end': 11085.38, 'start': 10772.564, 'title': 'Updating assignment submission process', 'summary': 'Details the process of updating the assignment submission process, including changing button names, handling submission logic, and creating graded assignments.', 'duration': 312.816, 'highlights': ["The process involves changing the button name from 'Submit' to 'Submit' after completing an assignment.", 'The logic for handling submission is detailed, including referencing questions and handling the success message.', 'Creation of graded assignments involves posting to the server, including the assignment ID, user answers, and the username of the person creating the assignment.']}, {'end': 11294.09, 'start': 11085.56, 'title': 'Creating graded assignment api view', 'summary': 'Involves setting up and overriding methods for a graded assignment create view, including importing the create api view, setting query set, and handling the creation of graded assignments.', 'duration': 208.53, 'highlights': ['Importing the create API view and setting query set The chapter involves importing the create API view and setting the query set equal to the graded assignment objects dot all.', "Overriding the method of creating the graded assignment The process includes overriding the method of creating the graded assignment due to passing in data that it's not understanding or knowing how to handle.", 'Handling the creation of graded assignments It entails handling the creation of graded assignments by using the graded assignment serializer and request data, and returning an HTTP to one if there is a graded assignment.']}, {'end': 11581.405, 'start': 11295.051, 'title': 'Creating graded assignments in python', 'summary': 'Covers the process of creating graded assignments in python, involving retrieving user data, calculating grades based on correct answers, and storing the results in a graded assignment object.', 'duration': 286.354, 'highlights': ['The process involves retrieving the username and handling it within the create method.', 'The script entails creating a graded assignment by comparing user answers to the correct ones and calculating the percentage of correct answers.', 'The method also includes retrieving the assignment and student data, and iterating through the questions to calculate the grade.']}, {'end': 11827.758, 'start': 11582.346, 'title': 'Creating graded assignments and user validation', 'summary': 'Explains the process of creating graded assignments and fixing user validation issues, resulting in successful submission and display of graded assignments. it also highlights the completion of various functionalities, including custom user creation, authentication, and assignment creation, while emphasizing the importance of learning about serializers and methods for nested relationships.', 'duration': 245.412, 'highlights': ['The process of creating graded assignments and fixing user validation issues resulted in successful submission and display of graded assignments.', 'The completion of various functionalities, including custom user creation, authentication, and assignment creation, was highlighted.', 'The tutorial emphasized the importance of learning about serializers and methods for nested relationships.', 'The chapter demonstrated the ability to customize serializers and learning methods to override, particularly beneficial for handling nested relationships and foreign keys.', 'The tutorial series concluded, encouraging viewers to leave comments for feedback and suggestions for future content.']}], 'duration': 1220.216, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/JIFqqdRxmVo/pics/JIFqqdRxmVo10607542.jpg', 'highlights': ['The process involves retrieving the username and handling it within the create method.', "The demonstration showcases the successful implementation of the filtering process, as evidenced by the retrieval of the specific user's graded assignment after the modification, ensuring the functionality is working as intended.", 'The logic for handling submission is detailed, including referencing questions and handling the success message.', "The process involves defining a 'get query set' method, dynamically querying the username from the URL, and filtering the query set based on the user's username, ensuring that only relevant assignments are returned to the user.", 'The script entails creating a graded assignment by comparing user answers to the correct ones and calculating the percentage of correct answers.', 'The completion of various functionalities, including custom user creation, authentication, and assignment creation, was highlighted.', 'The tutorial emphasized the importance of learning about serializers and methods for nested relationships.', 'The chapter demonstrated the ability to customize serializers and learning methods to override, particularly beneficial for handling nested relationships and foreign keys.']}], 'highlights': ['The project involves building a multiple user system for students and teachers.', 'The tutorial series aims to guide users in working with Django and React to create a system for managing assignments, providing a practical learning experience.', 'Creating a custom token serializer to receive user type and ID in addition to the token', "The process of creating a 'create' method on a serializer involves handling and processing incoming data to create and assign objects such as choices, questions, and assignments.", "The process involves defining a 'get query set' method, dynamically querying the username from the URL, and filtering the query set based on the user's username, ensuring that only relevant assignments are returned to the user."]}