【问题标题】:Django & Javascript: Passing additional variable for file uploadDjango & Javascript:为文件上传传递附加变量
【发布时间】:2018-12-23 13:29:11
【问题描述】:

好的,伙计们。我难住了。我正在关注this 上传文件的博客。我试图修改它,以便我的文件模型在另一个模型上有一个外键。弹出模块有效,但提交时无效。提交文件时,我不断收到“anothermodel_id field is required”错误,因此我需要将该字段传递给我的表单,但我不确定如何。

我看到了 javascript 行 function (e, data),我想我需要在这里添加变量,但我似乎做不到。我不知道数据是在哪里定义的。

型号

class File(models.Model):
    anothermodel_id        = models.ForeignKey(anothermodel)
    file              = models.FileField(upload_to=upload_product_file_loc)

表格

class FileForm(forms.ModelForm):
    class Meta:
        model = File
        exclude = ()

views.py

class FileUploadView(View):
def get(self, request):
    files = File.objects.all()
    return render(self.request, 'anothermodel/files.html', {'files': files, 'anothermodel_id': 'rb6o9mpsco'})

def post(self, request):
    form =FileForm(self.request.POST, self.request.FILES)
    print(form.errors)
    if form.is_valid():
        photo = form.save()
        data = {'is_valid': True, 'url': photo.file.url}
    else:
        print('we are not valid')
        data = {'is_valid': False}
    return JsonResponse(data)

html

<div style="margin-bottom: 20px;">
<button type="button" class="btn btn-primary js-upload-photos">
  <span class="glyphicon glyphicon-cloud-upload"></span> Upload photos
</button>
<input id="fileupload" type="file" name="file" multiple
       style="display: none;"
       data-url="{% url 'anothermodel:file-upload' %}"
       data-form-data='{"csrfmiddlewaretoken": "{{ csrf_token }}"}'>

javascript:

$(function () {
$(".js-upload-photos").click(function () {
    $("#fileupload").click(); 
    console.log('we clicked it')
    var anothermodelId = $("#start").find('.anotmodel_idId').val();
    console.log(anothermodelId)
  });
$("#fileupload").fileupload({
    dataType: 'json',
    done: function (e, data) {
      if (data.result.is_valid) {
        $("#gallery tbody").prepend(
          "<tr><td><a href='" + data.result.url + "'>" + data.result.name + "</a></td></tr>"
        )
      }
    }
  });

});

【问题讨论】:

  • 保存时,我看不到您将 anothermodel_id 传递给 FileForm 类的位置。我很少使用类视图,但我猜当您保存表单 photo = form.save() 时,您可能需要 commit=false 然后手动添加 anothermodel_id ,然后再进行真正的保存。您可能还需要排除 anthermodel_id 作为表单中的字段。否则您的表单可能永远不会有效。

标签: javascript jquery django file-upload


【解决方案1】:

anothermodel_id 是另一个模型的 ForeignKey,在您的情况下,该字段也是 必须 必需的。从客户端上传数据时,anothermodel_id 字段没有发送任何值。因此,此字段将保持未填充状态,并且在保存表单时会出现错误。根据您在 anothermodel_id 字段中存储的内容,可能有几种解决方案可以解决您的问题。

如果该字段不是很重要,您可以将其留空:

class File(models.Model):
    anothermodel_id = models.ForeignKey(anothermodel, blank=True, null=True)
    file = models.FileField(upload_to=upload_product_file_loc)    

如果您从另一个模型中保存一些东西。根据我从您的代码中了解到的情况,您可以使用models.Model 类中的save 方法:

from django.contrib.auth.models import User

class File(models.Model):
    anothermodel_id = models.ForeignKey(User)
    file = models.FileField(upload_to=upload_product_file_loc)

    def save():
        if self.file:
            anothermodel_id = request.user

    super(File, self).save(*args, **kwargs)

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 2019-03-24
    • 2018-06-28
    • 1970-01-01
    • 2014-09-30
    • 2020-11-20
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多