Django FileField: Файл не загружается в папку media или базу данных sql

Я делаю портал электронного обучения с использованием Django. Пользователь 'учитель' должен иметь возможность загружать файлы в любой курс. Однако файлы не загружаются в папку media/course_materials. Когда я проверяю базу данных sql, нет ни одного экземпляра идентификатора, создаваемого при загрузке файла (я пробовал и файл изображения, и файл документа word, оба очень маленького объема).

Вот отладочный комментарий, который я получаю от views :

" ]}>"

модели:

class Course(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(default ="Description of Course")
    course_materials = models.ManyToManyField('CourseMaterial', blank=True)

    def __str__(self):
        return self.name
    
class CourseMaterial(models.Model):
    name = models.CharField(max_length=255)
    file = models.FileField(upload_to='course_materials/')

    def __str__(self):
        return self.name

Просмотров:

def edit_course(request, course_id):
    course = get_object_or_404(Course, id=course_id)
    if request.method == 'POST':
        form = CourseForm(request.POST, request.FILES.get, instance=course)
        if form.is_valid():
            print(request.FILES)
            course = form.save(commit=False)
            course.save()
            form.save_m2m()  # Save many-to-many relationships
            return redirect('teacher')  # Redirect to teacher dashboard after editing the course
    else:
        form = CourseForm(instance=course)
    
    context = {
        'form': form,
        'course': course,
    }
    return render(request, 'elearn/edit_course.html', context)

forms.py:

class CourseForm(forms.ModelForm):
    class Meta:
        model = Course
        fields = ['name', 'description', 'course_materials']

        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['course_materials'].queryset = CourseMaterial.objects.none()

html:

<form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="mb-3">
            <label for="id_name" class="form-label">Course Name</label>
            {{ form.name }}
        </div>
        <div class="mb-3">
            <label for="id_description" class="form-label">Description</label>
            {{ form.description }}
        </div>
        <div class="mb-3">
            <label for="id_course_materials" class="form-label">Course Materials</label>
            <ul>
                {% for material in course.course_materials.all %}
                <li>{{ material.name }}: <a href="{{ material.file.url }}">{{ material.file.name }}</a></li>
                {% endfor %}
            </ul>

            <input label="course_materials_input" type="file" name="course_materials" class="form-control-file">
        </div>
        <button type="submit" class="btn btn-primary">Save Changes</button>
    </form>

Я также добавил их в файл setting.py:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

На ваш взгляд, измените:

request.FILES.get

To:

request.FILES

Также стоит отметить, что медиа не будут храниться непосредственно в реляционной базе данных. БД просто содержит ссылку на место, где хранится медиа.

Вернуться на верх