1. Before You Build








2. View Type Decision

Use This When
Function-based view (def) Simple, one-off views with minimal logic
Class-based view (View, TemplateView, ListView) Standard patterns (list, detail, create, update, delete)
CreateView / UpdateView Form-based create and update with Django forms
ListView / DetailView Standard read views
DeleteView Standard delete with confirmation
DRF APIView or ViewSet JSON APIs consumed by React or other frontends


3. Authentication & Authorization








4. Form & Input Validation








5. Business Logic Placement

This is the most important rule for Django views.






Good Pattern

# views.py
def create_project(request):
    form = ProjectForm(request.POST)
    if not form.is_valid():
        return render(request, 'projects/create.html', {'form': form})

    project = ProjectService.create_project(
        workspace=request.workspace,
        name=form.cleaned_data['name'],
        created_by=request.user
    )
    messages.success(request, 'Project created successfully.')
    return redirect('projects:detail', pk=project.pk)

Bad Pattern (logic in view)

# views.py — DO NOT DO THIS
def create_project(request):
    name = request.POST.get('name')
    slug = name.lower().replace(' ', '-')
    if Project.objects.filter(slug=slug).exists():
        # ...
    project = Project.objects.create(name=name, slug=slug, ...)
    send_email(request.user, 'project_created', project)
    AuditLog.objects.create(...)
    return redirect(...)

6. Response Handling

For HTML Views (Template)





For REST API Views (JSON)







7. Error Handling









8. Reusability & Code Organization






9. Testing Requirements










Before Marking Done

10. Django View Checklist — Before Marking Done

View Type

Auth & Permissions




Form/Validation




Business Logic



Response




Error Handling & Testing





Practice Task

Apply what you learned by building a real view with a reusable permission mixin, form validation, and a service layer. Covers: LoginRequiredMixin, WorkspaceMemberMixin, ProjectForm with cross-field date validation, ProjectService.create_project(), POST→redirect→GET pattern.

Open Task 01: Build a Project List & Create View