2017-11-25 109 views
1

我使用Django的扩展用户配置文件,而不是有很多图像字段我想在我的模型中创建一个新的图像类,我可以上传许多图像,自动分配给正确的用户。然后用户可以查看和编辑他们的所有图像。我基本上停留在最后一部分(查看和编辑)。django上传到图像与用户的外键模型

我的应用程序被称为已经

models.py

​​

forms.py

class ImagesForm(forms.ModelForm): 
    image = forms.ImageField(widget=forms.ClearableFileInput(attrs={'multiple': True})) 
    class Meta: 
     model = Images 
     fields = (
      'image', 
     ) 

1.编辑图片(s)

这种设置,上载图像(管理员)但不分配用户。另一个问题是我只能上传/编辑1张图片。

views.py

@login_required 
@transaction.atomic 
def edit_images(request): 
    if request.method == 'POST': 
     images_form = ImagesForm(request.POST, request.FILES) 
     if images_form.is_valid(): 
      images_form.save() 
      return redirect('ve:index_account') 
     else: 
      pass 

    else: 
     images_form = ImagesForm(request.POST, request.FILES) 

    return render(request, 've/cp/edit_images_account.html', { 
     'images_form': images_form, 
    }) 

edit_images_account.html

<form method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ images_form.as_p }} 
    <button type="submit">Upload</button> 
    </form> 

2.查看图片(s)

views.py

@login_required 
def index_account(request): 
    args = {'user': request.user} 
    return render(request, 've/cp/index_account.html', args) 

index_account.html

<p><a href="{% url 've:edit_images' %}">Edit your images</a></p> 
      {% if user.images.images %} 
       {% for img in user.images %} 
       <img src="{{ user.images.image.url }}"><br> 
       {% endfor %} 
      {% else %} 
      <p>No images</p> 

      {% endif %} 
+0

你想通过一个和编辑图像逐一上传图片吗?或者想要一次上传多张图片? –

+0

理想情况下多个,像编辑所有图像页 –

回答

1

这里有很多事情要做。所以让我们一步一个脚印吧。

首先,您当前已将图像的用户FK设置为​​空。有这样的用例吗?如果不是,我会建议删除。每个图像应该属于一个用户,对吧?所以删除null。

user = models.ForeignKey(User, on_delete=models.CASCADE) 

其次,一旦您进行了此更改,您可能会注意到表单不再有效,因为它也需要用户。你可以做以下

images_form = ImagesForm(request.POST, request.FILES, initial={'user': request.user}) 

这应该在用户FK填写表格,你可以上传其绑定到用户的一个图像。

但既然你最终想要上传多个文件,我会鼓励你(在链接例子等)只需使用一个正常的形式,而不是一个ModelFormfollowing instructions给出了如何上传表单中的多个文件的提示。因此,当您循环访问列表中的文件时,您必须将每个文件保存在模型中。由于ModelForm是专门被束缚在单一模型实例,最好使用常规的形式,写额外的代码保存在多个实例中的文件,因为这是你所需要的。

+0

感谢所有的帮助乔纳森!在这种情况下,从ModelForm切换到Form是朝着正确方向迈出的重要一步。也可以通过调试打印到控制台“print(request.FILES。我们在视图中发现“image = Images(user = request.user,image = request.FILES)”需要成为“image = Images(user = request.user,image = request.FILES [')图片'])” –