【问题标题】:Django - upload images with additional informationDjango - 上传带有附加信息的图像
【发布时间】:2020-07-09 00:50:05
【问题描述】:

假设我有一个博客网站。每个博客都由图像组成。所以,我想根据它们所属的博客对图像进行排序。但是在上传的时候,如何自动将博客id与图片一起传递呢?

我的模型是这样的:

class Blog(models.Model):
    name = models.CharField()
    blog = models.CharField()

class Photo(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    file = models.FileField(upload_to=get_upload_path)

我的 forms.py 看起来像:

class PhotoForm(forms.ModelForm):
    class Meta:
        model = Photo
        fields = ('file', 'blog')

您会在字段中看到“博客”。我实际上如何在那里传递博客 ID?

目前,我上传页面的html是这样的:

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

其实这种上传图片的方式取自this great article by Vitor Freitas

现在,我想通过views.py 将博客ID 传递给模板,其中包含我已经完成的上下文。但是如何保存它并与我上传的图像一起传递呢?

views.py 看起来像:

class BlogDetailView(View):

    def get(self, request,**kwargs):
        page = get_object_or_404(Page, pk=self.kwargs['pk'])
        context = {'page':page}

        return render(self.request, 'blog.html', context=context)


    def post(self, request, **kwargs):
        form = PhotoForm(self.request.POST, self.request.FILES)
        if form.is_valid():
            photo = form.save()
            data = {'is_valid': True, 'name': photo.file.name, 'url': photo.file.url}
        else:
            data = {'is_valid': False}
        return JsonResponse(data)

那么在上传时如何将图片与博客关联呢?

任何帮助将不胜感激。

【问题讨论】:

  • 您可以使用具有预定义值的隐藏字段,如此处所述stackoverflow.com/questions/15795869/… 参见字段“标签”。此外,如果您的表单位于像 post/1/ 这样的 url 下 - 您仍然可以像在 get 方法中那样从 kwargs 引用由 urlpattern 解析的参数。

标签: python django django-forms django-views django-uploads


【解决方案1】:

你为什么不直接在你的表单中传递文件:

if form.is_valid():
    photo = form.save(commit=False)
    photo.file = request.FILES['file']
    photo.save()

【讨论】:

    【解决方案2】:

    好吧,所以我这样解决了我的问题:

    我保持原样。在 html 中,我没有为博客 ID 做任何事情。相反,在 views.py 中,我复制了我的发布请求,如下所示:

        stuff = request.POST.copy()
        stuff['blog'] = blog.id
    

    然后,我用这样的“东西”创建了表单:form = PhotoForm(stuff, self.request.FILES)

    然后进行验证。

    这样做,我的问题得到了解决,因为我现在正在通过我的照片传递博客 ID。

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2015-05-26
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多