2013-11-05 112 views
2

我用jQuery使用Django上传文件使用Ajax。但是,在文件上传后(文件确实上传正确;数据库已更新,并且位于服务器上),javascript会返回SyntaxError: Unexpected token <错误。Django:SyntaxError:意外的令牌<

我不知道这是javascript中的错误还是django中的错误;我看到的其他问题似乎建议确保信息确实采用JSON格式,但似乎在我的情况下格式正确。我不明白为什么会有错误,因为一切看起来都很好。我的日志中没有错误。

如果我只能看到更有帮助的错误消息,我会更容易解决问题。

这里是我的views.py:

def response_mimetype(request): 
    if "application/json" in request.META['HTTP_ACCEPT']: 
     return "application/json" 
    else: 
     return "text/plain" 

class JSONResponse(HttpResponse): 
    """JSON response class.""" 

    def __init__(self,obj='',json_opts={},mimetype="application/json",*args,**kwargs): 
     content = simplejson.dumps(obj,**json_opts) 
     a = super(JSONResponse,self).__init__(content,mimetype,*args,**kwargs) 

class UploadedFileCreateView(CreateView): 
    model = UploadedFile 
    form_class = UploadedFileForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.project_id = self.kwargs['proj_key'] 
     self.object.save() 
     f = self.request.FILES.get('file') 

     data = [{ 
      'name': self.object.name(), 
      'url': "/uploads/xmlfiles/" + self.object.name().replace(" ", "_"), 
      'delete_url': reverse('fileupload:upload-delete', 
       kwargs={'pk':self.object.id, 
       'proj_key':self.kwargs['proj_key']}), 
      'delete_type': "DELETE"}] 

     response = JSONResponse(data, {}, response_mimetype(self.request)) 

     response['Content-Disposition'] = 'inline; filename=files.json' 

     return super(UploadedFileCreateView, self).form_valid(form) 

    def get_context_data(self, **kwargs): 
     context = super(UploadedFileCreateView, self).get_context_data(**kwargs) 
     context['files'] = UploadedFile.objects.all() 
     context['proj'] = int(self.kwargs["proj_key"]) 
     return context 

这是我的models.py:

class UploadedFile(models.Model): 
    """This represents a file that has been uploaded to the server.""" 
    STATE_UPLOADED = 0 
    STATE_ANNOTATED = 1 
    STATE_PROCESSING = 2 
    STATE_PROCESSED = 4 
    STATES = (
     (STATE_UPLOADED, "Uploaded"), 
     (STATE_ANNOTATED, "Annotated"), 
     (STATE_PROCESSING, "Processing"), 
     (STATE_PROCESSED, "Processed"), 
    ) 

    status = models.SmallIntegerField(choices=STATES, 
     default=0, blank=True, null=True) 
    file = models.FileField(upload_to=settings.XML_ROOT) 
    project = models.ForeignKey(Project) 

    def __unicode__(self): 
     return self.file.name 

    def name(self): 
     return os.path.basename(self.file.name) 

    def save(self, *args, **kwargs): 
     if not self.status: 
      self.status = self.STATE_UPLOADED 
     super(UploadedFile, self).save(*args, **kwargs) 

    def delete(self, *args, **kwargs): 
     os.remove(self.file.path) 
     self.file.delete(False) 
     super(UploadedFile, self).delete(*args, **kwargs) 

    def get_absolute_url(self): 
     return u'/upload/projects/%d' % self.id 

class UploadedFileForm(ModelForm): 
    class Meta: 
     model = UploadedFile 
     exclude = ('project',) 
+0

在Chrome中尝试使用它,打开DevTools并确保在“sources”选项卡上单击“未捕获异常暂停”切换。这将帮助您本地化错误,并希望进入下一步调试。 –

+1

您正在创建'JSONResponse'实例,但不会从视图中返回。你的JSON调用会得到任何'super(UploadedFileCreateView,self).form_valid'返回的结果 - 一个HTTP重定向,如果内存服务的话。 –

+0

请务必查看服务器返回的内容,并使用控制台中的net选项卡。 – epascarello

回答

3

根据文档here,该form_valid()方法需要返回JSON作为HTTPResponse。相反,调用超类中的form_valid()将覆盖前两行上创建的响应。

编辑 -这是为我工作:上述

def response_mimetype(request): 
    if "application/json" in request.META['HTTP_ACCEPT']: 
    return "application/json" 
    else: 
    return "text/plain" 

class UploadedFileCreateView(CreateView): 
    model = UploadedFile 
    form_class = UploadedFileForm 

    def form_valid(self, form): 
    self.object = form.save(commit=False) 
    self.object.project_id = self.kwargs['proj_key'] 
    self.object.save() 
    f = self.request.FILES.get('file') 

    data = [{ 
     'name': self.object.name(), 
     'url': "/uploads/xmlfiles/" + self.object.name().replace(" ", "_"), 
     'type': "application/xml", 
     'size': self.object.file.size, 
     'delete_url': reverse('fileupload:upload-delete', 
     kwargs={'pk':self.object.id, 
     'proj_key':self.kwargs['proj_key']}), 
     'delete_type': "DELETE"}] 

    return HttpResponse(simplejson.dumps(data), content_type = response_mimetype(self.request)) 

在链接的代码捆绑Ajax响应代码作为一个混合这将使该项目重用代码的其他形式。

在Firefox插件中查看对Ajax调用的响应Firebug,Net选项卡或Chrome浏览器对应的帮助。这些将显示请求和响应头,确保正确的设置正在发送和返回。

+0

使用你的代码,我得到'Empty file upload result'作为javascript错误,尽管在控制台中似乎没有javascript异常。 – Plasma

+0

啊好的,你可以发布你的HTML/JavaScript?然后,我很乐意正确调试代码,;)。 –

+0

非常感谢!这里是我的模板: https://github.com/PlasmaSheep/wseer/blob/master/wseeruploader/apps/fileupload/templates/fileupload/uploadedfile_form.html 而且在这里引用的javascript: https://开头github上。 com/PlasmaSheep/wseer/tree/master/wseeruploader/apps/fileupload/static/js – Plasma