【问题标题】:Django: SyntaxError: Unexpected token <Django: SyntaxError: Unexpected token <
【发布时间】:2013-11-15 19:31:12
【问题描述】:

我正在使用 django 和 jquery 来使用 ajax 上传文件。但是,在文件上传后(文件确实上传正确;数据库已更新并且它们在服务器上)javascript 返回 SyntaxError: Unexpected token &lt; 错误。

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

如果我只能看到更有用的错误消息,我会更轻松地解决问题。

这是我的观点.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',)

【问题讨论】:

  • 在 Chrome 中尝试,打开 DevTools 并确保单击“源”选项卡上的“暂停未捕获的异常”切换。这将帮助您定位错误,并有望进入下一步的调试。
  • 您正在创建您的 JSONResponse 实例,但不会从您的视图中返回它。您的 JSON 调用将获取 super(UploadedFileCreateView, self).form_valid 返回的任何内容 - 如果内存可用,则为 HTTP 重定向。
  • 始终查看从服务器返回的内容,使用控制台中的 net 选项卡。

标签: javascript jquery ajax django django-views


【解决方案1】:

根据文档hereform_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 响应代码捆绑为 Mixin,这将允许项目中的其他表单重用代码。

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

【讨论】:

  • 使用您的代码,我得到 Empty file upload result 作为 javascript 错误,尽管控制台中似乎没有 javascript 异常。
  • 啊好的,你能发布你的 html / javascript 吗?然后我很乐意正确调试代码,;)。
  • @Plasma 我已经从 github 调试了一个克隆,并且在我上面的帖子中编辑的 form_valid() 正在为我使用 firefox 中的 jquery-file-upload 插件。很棒的项目,顺便说一句。
  • 这解决了我的问题。感谢您加倍努力!
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2019-02-10
  • 2019-11-10
  • 2014-07-08
  • 2020-09-26
  • 2011-03-09
  • 2014-01-06
  • 2012-04-10
相关资源
最近更新 更多