Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中上载文件?_Python_Ajax_Django - Fatal编程技术网

Python 如何在Django中上载文件?

Python 如何在Django中上载文件?,python,ajax,django,Python,Ajax,Django,很抱歉,我对Django真的很陌生,我已经尝试了文档中的步骤。不幸的是,它并不像我预期的那样工作。我希望在执行这些步骤后,它会将文件保存到我的媒体文件夹中。如果可能的话,我也想使用AJAX,但我不能理解它的流程 HTML <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfile">

很抱歉,我对Django真的很陌生,我已经尝试了文档中的步骤。不幸的是,它并不像我预期的那样工作。我希望在执行这些步骤后,它会将文件保存到我的媒体文件夹中。如果可能的话,我也想使用AJAX,但我不能理解它的流程

HTML

 <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}}。调试速度更快。