Django - 上传带有附加信息的图像
Django - upload images with additional information
假设我有一个博客网站。每个博客都包含图像。所以,我想根据它们属于哪个博客对图像进行排序。但是在上传时,如何自动将博客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')
您在字段中看到 '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)
那么上传时如何将图片与博客相关联?
任何帮助将不胜感激。
你为什么不像这样在表单中传递文件:
if form.is_valid():
photo = form.save(commit=False)
photo.file = request.FILES['file']
photo.save()
好的,所以我这样解决了我的问题:
我保持原样。在 html 中,我没有为博客 ID 做任何事情。相反,在 views.py 中,我像这样复制了我的 post 请求:
stuff = request.POST.copy()
stuff['blog'] = blog.id
然后,我用 'stuff' 创建了这样的表单:form = PhotoForm(stuff, self.request.FILES)
然后进行验证。
这样做,我的问题得到了很好的解决,因为我现在正在用我的照片传递博客 ID。
假设我有一个博客网站。每个博客都包含图像。所以,我想根据它们属于哪个博客对图像进行排序。但是在上传时,如何自动将博客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')
您在字段中看到 '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)
那么上传时如何将图片与博客相关联?
任何帮助将不胜感激。
你为什么不像这样在表单中传递文件:
if form.is_valid():
photo = form.save(commit=False)
photo.file = request.FILES['file']
photo.save()
好的,所以我这样解决了我的问题:
我保持原样。在 html 中,我没有为博客 ID 做任何事情。相反,在 views.py 中,我像这样复制了我的 post 请求:
stuff = request.POST.copy()
stuff['blog'] = blog.id
然后,我用 'stuff' 创建了这样的表单:form = PhotoForm(stuff, self.request.FILES)
然后进行验证。
这样做,我的问题得到了很好的解决,因为我现在正在用我的照片传递博客 ID。