gpt4 book ai didi

python - django上传到带有外键的图像模型给用户

转载 作者:行者123 更新时间:2023-12-01 02:25:12 25 4
gpt4 key购买 nike

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

我的应用程序名为 ve

模型.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)

表单.py

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

<强>1。编辑图像

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

View .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。查看图片

View .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。

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

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

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

这应该在表单中填写用户 FK,然后您就可以上传与用户绑定(bind)的一张图像。

但是由于您最终想要上传多个文件,我建议您只使用普通表单(如链接示例中所示)而不是 ModelFormfollowing instructions给出有关如何在表单中上传多个文件的提示。因此,当您循环浏览列表中的文件时,您必须将每个文件保存在模型中。由于 ModelForm 专门绑定(bind)到单个模型实例,因此最好使用常规表单并编写额外的代码来将文件保存在多个实例中,因为这就是您所需要的。

关于python - django上传到带有外键的图像模型给用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com