【问题标题】:django upload to image model with foreign key to userdjango使用外键上传到图像模型给用户
【发布时间】:2017-11-25 14:25:26
【问题描述】:

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

我的应用叫做 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 %}

【问题讨论】:

  • 要一张一张上传图片,一张一张编辑图片吗?还是想一次上传多张图片?
  • 理想情况下是多个,例如编辑所有图像页面

标签: python django image foreign-keys


【解决方案1】:

这里发生了很多事情。因此,让我们一步一步来。

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

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

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

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

这应该在表单中填写用户 FK,您就可以上传一张与用户相关的图像。

但由于您最终想要上传多个文件,我鼓励您只使用普通格式(如链接示例中的)而不是 ModelFormfollowing instructions 提示了如何在一个表单中上传多个文件。因此,当您遍历列表中的文件时,您必须将每个文件保存在模型中。由于ModelForm 专门与单个模型实例相关联,因此最好使用常规形式并编写额外代码以将文件保存在多个实例中,因为这正是您所需要的。

【讨论】:

  • 感谢乔纳森的所有帮助!在这种情况下,从 ModelForm 切换到 Form 是朝着正确方向迈出的一大步。同样通过打印到控制台“print(request.FILES.keys())”进行调试,我们在视图中发现“image = Images(user=request.user, image=request.FILES)”需要是“image =图片(user=request.user, image=request.FILES['image'])"
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 2012-10-20
  • 2017-03-23
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多