2017-11-25 188 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 [')圖片'])」 –