我正在使用 Django 制作一个电子学习门户。用户“老师”应该能够上传任何课程下的文件。但是,文件未上传到 media/course_materials 文件夹中。当我检查sql数据库时,上传文件时没有创建id的实例(我尝试了图像文件和word文档文件,两者的存储空间都很小)。
这是我从视图中得到的调试注释:
"
型号:
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
致:
request.FILES
还值得注意的是,媒体不会直接存储在关系数据库中。数据库仅包含媒体存储位置的引用。