Python 如何在Django中上载文件?
很抱歉,我对Django真的很陌生,我已经尝试了文档中的步骤。不幸的是,它并不像我预期的那样工作。我希望在执行这些步骤后,它会将文件保存到我的媒体文件夹中。如果可能的话,我也想使用AJAX,但我不能理解它的流程 HTMLPython 如何在Django中上载文件?,python,ajax,django,Python,Ajax,Django,很抱歉,我对Django真的很陌生,我已经尝试了文档中的步骤。不幸的是,它并不像我预期的那样工作。我希望在执行这些步骤后,它会将文件保存到我的媒体文件夹中。如果可能的话,我也想使用AJAX,但我不能理解它的流程 HTML <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfile">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile">
<button type="submit">Upload</button>
</form>
forms.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
email = models.TextField(max_length=500, blank=True)
contact_number = models.CharField(max_length=30, blank=True)
profile_picture = models.FileField(null=True,blank=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
class UploadForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('profile_picture',)
def model_form_upload(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('/home/')
视图.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
email = models.TextField(max_length=500, blank=True)
contact_number = models.CharField(max_length=30, blank=True)
profile_picture = models.FileField(null=True,blank=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
class UploadForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('profile_picture',)
def model_form_upload(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('/home/')
我正在尝试为用户的个人资料保存照片。请帮帮我。如果有一种方法可以通过AJAX实现这一点,那也会很有帮助。以下是我解决问题的方法: 我首先使用这种方法从输入中提取图像
function extractPhoto(input) {
var files = input[0].files;
if (!files.length) {
alert('Unable to upload: no file selected');
return;
}
return files[0]
}
然后,我使用jQuery的FormData和ajax将提取的照片传递给我的视图
var image = $("#image");
$("#uploadbutton").click(function () {
const form = new FormData();
form.append('image', extractPhoto(image));
generateCSRFToken();
$.ajax({
url: '/upload_photo/',
data: form,
type: "POST",
contentType: false,
processData: false,
success: function (data) {
location.reload();
},
error: function (data) {
}
})
});
然后我在我的视图中处理它
def upload_photo(request):
if 'image' not in request.FILES:
return HttpResponse(status=400)
user = request.user
user.profile.profile_picture = request.FILES.get('image')
user.profile.save();
return HttpResponse(status=200)
你是如何调试它的?使用
print(form.errors)
生成一个else(用于form.is\u valid()
),以检查发生了什么。我认为问题在于输入类型文件的name属性,但让我们检查一下,它没有显示错误。它只是刷新页面,但没有任何内容进入我的媒体文件夹OK。你说你是Django的新手,对吧?让我们检查一下基本情况。打印表单。错误应出现在终端上(而不是浏览器上)。当您提交表单时,其他信息(用户、电子邮件和联系人号码)会出现在数据库中?@Rafael我有一个单独的处理程序处理我的电子邮件和联系人号码,该处理程序已经在运行。这就是为什么我上传表单中唯一的字段是profile\u picture。但我不确定它是否就是这样工作的。我想发生的是,我已经有了一个联系人和电子邮件的个人资料,我只想添加一个个人资料图片。当我为个人资料图片提交表单时,它只是刷新,没有任何savedOk。但是你在检查控制台?有没有打印错误?并删除重定向(仅用于调试。像GET请求中那样进行渲染)。在HTML上添加{form.errors}}。调试速度更快。