簡體   English   中英

django使用用戶外鍵上傳到圖像模型

[英]django upload to image model with foreign key to user

我使用的是Django的擴展用戶配置文件,而不是擁有許多圖像字段,我想在模型中創建一個新的Images類,以便上傳許多圖像,這些圖像會自動分配給正確的用戶。 然后,用戶可以查看和編輯所有圖像。 我基本上停留在最后一部分(查看和編輯)。

我的應用叫做ve

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    ... etc   

class Images(models.Model):
    image = models.ImageField(upload_to='profile_image', null=True, default='profile_image/none/no-img.png')
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

forms.py

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

1.編輯圖片

此設置會上傳圖片(以管理員身份),但不會分配用戶。 另一個問題是我只能上傳/編輯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.查看圖像

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 %}

這里有很多事情。 因此,讓我們一次邁出一步。

首先,當前您已將圖像的用戶FK設置為​​null。 是否有用例? 如果沒有,我建議將其刪除。 每個圖像都應該屬於一個用戶,對不對? 因此,請刪除null。

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

其次,一旦進行了更改,您可能會注意到該表格不再有效,因為它也需要用戶。 您可以執行以下操作

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

這應該在表格中填寫用戶FK,您就可以上傳與用戶相關的一張圖片。

但是,由於您最終想要上傳多個文件,因此我建議您僅使用常規形式(如鏈接示例中)而不是ModelForm 以下說明提示了如何在表單中上傳多個文件。 因此,當您遍歷列表中的文件時,必須將每個文件保存在模型中。 由於ModelForm是專門與單個模型實例綁定的,因此最好使用常規形式並編寫額外的代碼以將文件保存在多個實例中,因為這就是您所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM