You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django学习管理系统实现用户UI端添加课程功能的步骤咨询

Hey there! Let's walk through the exact steps you need to finish building this user-facing course submission feature. You've already got the frontend template ready, so we'll focus on tying it properly to your Django backend and fixing any mismatches between your form and model.

Step 1: Build a ModelForm for Course Submission

Instead of handling form data manually, using Django's ModelForm will save you time and ensure validation matches your Course model perfectly. Update your forms.py like this:

from django import forms
from .models import Course, Category

class CourseSubmitForm(forms.ModelForm):
    # Keep your custom category dropdown (we'll map abbreviations to actual Category instances later)
    category = forms.ChoiceField(
        choices=[
            ("GD", "Graphics & Design"),
            ("WD", "Web & Mobile Development"),
            ("BE", "Basic Education"),
            ("CS", "Computer Science"),
            ("PT", "Programming & Tech"),
        ],
        required=True
    )

    class Meta:
        model = Course
        # Exclude fields that should be set automatically (no need for users to fill these)
        exclude = ['user', 'slug', 'created_at', 'updated_at', 'is_published']

Step 2: Create a View to Handle Form Submission

Add this view to your views.py to handle both loading the form and processing submissions. We'll use login_required to ensure only authenticated users can access it:

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .forms import CourseSubmitForm
from .models import Course, Category

@login_required
def teach_view(request):
    if request.method == 'POST':
        # Include request.FILES to handle the thumbnail upload
        form = CourseSubmitForm(request.POST, request.FILES)
        if form.is_valid():
            # Create a Course object but don't save to the database yet
            course = form.save(commit=False)
            # Associate the course with the currently logged-in user
            course.user = request.user
            # Map the dropdown abbreviation to the actual Category instance
            category_abbr = form.cleaned_data['category']
            category_map = {
                "GD": "Graphics & Design",
                "WD": "Web & Mobile Development",
                "BE": "Basic Education",
                "CS": "Computer Science",
                "PT": "Programming & Tech"
            }
            # Fetch the matching Category from your database
            course.category = Category.objects.get(title=category_map[category_abbr])
            # Your model's save method will auto-generate the slug
            course.save()
            # Redirect to the newly created course's detail page
            return redirect('courses:course-details', slug=course.slug)
    else:
        # Load an empty form for GET requests
        form = CourseSubmitForm()
    
    return render(request, 'courses/Teach.html', {'form': form})

Pro tip: If you prefer class-based views, you can use CreateView with LoginRequiredMixin instead of the function-based view above—just adjust the logic to handle the category mapping.

Step 3: Add the URL Route

Update your courses/urls.py to add a route for the course submission page:

from django.urls import path
from .views import *
app_name = 'courses'
urlpatterns = [
    path('courses/<slug:slug>', CourseDetailView.as_view(), name='course-details'),
    path('courses/<slug:slug>/category', CoursesByCategoryListView.as_view(), name='course-by-category'),
    # Add this new route for the teach page
    path('teach/', teach_view, name='teach'),
]

Step 4: Fix Mismatched Fields in Your Teach.html Template

Your current template has a few field names that don't match your Course model—fix these to ensure data is saved correctly:

  1. Change the thumbnail input's name from photo to thumbnail (matches your model's field):
<div class="mb-3">
    <label>Thumbnail</label>
    <input type="file" required class="form-control" name="thumbnail">
</div>
  1. Change the video URL input's name from url to video_url:
<div class="mb-3">
    <label for="formGroupExampleInput2" class="form-label">Video URL</label>
    <input name="video_url" type="text" required class="form-control" id="f10" placeholder="Enter the URL of this course.">
</div>

Optional: If you want to simplify your template, you can replace hardcoded fields with {{ form.as_p }} (but keep your existing UI if you prefer the custom styling).

Step 5: Test the End-to-End Flow

  • Log in as a registered user
  • Navigate to /courses/teach/ (adjust the URL based on your project's root path)
  • Fill out the form and submit
  • Check your Django Admin panel to confirm the course was created with the correct user, category, and all details
  • Verify the thumbnail image was uploaded to the thumbnails/ directory
  • Ensure the slug was generated correctly via your model's save method

Bonus: Handle Edge Cases

  • Add form error display in your template (add {% if form.errors %} block to show validation messages)
  • Confirm your MEDIA_ROOT and MEDIA_URL are configured in settings.py to handle file uploads properly
  • Add permission checks if you only want specific users (like instructors) to submit courses
  • Update your Course model's save method to handle duplicate slugs (e.g., add a numeric suffix if a title is reused)

内容的提问来源于stack exchange,提问作者Md Mosleh Uddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:44:09