首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >‘'Uploads’对象在Django中不可迭代

‘'Uploads’对象在Django中不可迭代
EN

Stack Overflow用户
提问于 2022-02-05 21:55:03
回答 2查看 801关注 0票数 1

我试图让每个模型对象都有自己的页面,并附加所有其他模型对象,使用模态id,我尝试使用{ img.queryset.all.id } html标签来显示照片,但这是行不通的。我知道问题在views.py或single_page.html中,也可能在models.py中,但我认为这不太可能。当我点击照片时,它会把它带到带有照片图标的页面上,它不会显示它,因为照片是未知的。每次我在img %}中使用{% for x时,它都说'Uploads‘对象是不可积的。如果有人能帮忙那就太好了。

modals.py

代码语言:javascript
运行
复制
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, null = False, blank = True)
    first_name = models.CharField(max_length = 50, null = True, blank = True)
    last_name = models.CharField(max_length = 50, null = True, blank = True)
    phone = models.CharField(max_length = 50, null = True, blank = True)
    email = models.EmailField(max_length = 50, null = True, blank = True)
    bio = models.TextField(max_length = 300, null = True, blank = True)
    profile_picture = models.ImageField(default = 'default.png', upload_to = "img/%y", null = True, blank = True)

    def __str__(self):
        return f'{self.user.username} Profile'



class Uploads(models.Model):
    title = models.CharField(max_length = 500, null = True,)
    artiste = models.CharField(max_length=500, null = True,)
    album = models.ForeignKey('Album', on_delete=models.SET_NULL,null=True,blank=True)
    time_length=models.DecimalField(max_digits=20, decimal_places=2,blank=True, null = True,)
    audio_file=models.FileField(upload_to='musics/',validators=[validate_is_audio], null = True,)

    caption = models.CharField(max_length = 100, blank=True)
    file = models.ImageField(upload_to = "img/%y", null = True)
    profile = models.ForeignKey(Profile, on_delete = models.CASCADE, default = None, null = True)
    id = models.AutoField(primary_key = True, null = False)


    def __str__(self):
        return str(self.file) and f"{self.id}"

class Album(models.Model):
    name=models.CharField(max_length=400)

views.py

代码语言:javascript
运行
复制
def profile(request, user):
    img = Uploads.objects.filter(profile_id = request.user.profile)         #Make sure only your account *images stays on the page
    profile = Profile.objects.filter(user = request.user)
    context = {"profile": profile, "img": img}

    return render(request, "main/profile.html", context)

def single_page(request, id):
    img = Uploads.objects.filter(id = id).first()    
    profile = Uploads.objects.filter(id = request.user.id)

    context = { "img": img, "profile": profile}

    return render(request, "main/single_page.html", context)

single_page.html

代码语言:javascript
运行
复制
{% block content %}
<body>

    {% for x in img %}
    <p>{{title}}</p>

    <img src="{{x.file.url}}" height="100%" width="100%"  class="myImg">
    {% endfor %}


</body>
{% endblock %}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-06 00:16:13

由于您是通过id对配置文件进行过滤,并且还指定了第一个,所以不可能循环通过,因为首先会呈现第一个对象,因此循环将只通过这样的操作来添加(img.all):

代码语言:javascript
运行
复制
# Your view.py 
def single_page(request, id):
    img = Uploads.objects.filter(id=id)    
    profile = Uploads.objects.filter(id = request.user.id)

    context = { "img": img, "profile": profile}

    return render(request, "main/single_page.html", context)

你的Html

代码语言:javascript
运行
复制
{% block content %}
<body>
    {% for x in img.all %}
    <p>{{title}}</p>

    <img src="{{x.file.url}}" height="100%" width="100%"  class="myImg">
    {% endfor %}

</body>
{% endblock %}
票数 0
EN

Stack Overflow用户

发布于 2022-02-06 00:16:23

如果img是一个对象,则不能对其进行迭代,因此for循环是无效的。您应该能够使用:{{ img.file.url }}访问它的url。

不要使用id作为变量,它是内置函数。不要通过Uploads.id来过滤request.user.id,因为它不会起作用。这是不同的型号。

对于单张照片,您应该在views中完成

代码语言:javascript
运行
复制
from django.shortcuts import get_object_or_404

def single_page(request, img_id):
    img = get_object_or_404(Uploads, id=img_id)

    context = {"img": img}

    return render(request, "main/single_page.html", context)

single_page.html:

代码语言:javascript
运行
复制
{% block content %}
<body>

    <p>{{ img.title }}</p>

    <img src="{{ img.file.url }}" height="100%" width="100%"  class="myImg">

</body>
{% endblock %}

如果您有一个User的更多图片,您可以通过以下方式找到它们:

代码语言:javascript
运行
复制
images = Uploads.objects.filter(profile=self.request.user.profile)
context = {"images": images}

在模板中:

代码语言:javascript
运行
复制
{% for img in images %}

    <p>{{ img.title }}</p>

    <img src="{{ img.file.url }}" height="100%" width="100%" class="myImg">

{% endfor %}

如果您想获得profile,不要使用filter搜索它,因为您将得到QuerySet,而不是对象实例。要获得单个对象,您应该像我以前向您展示的那样:

代码语言:javascript
运行
复制
profile = get_object_or_404(Profile, user=request.user)
# or
profile = Profile.objects.get(user=request.user)

或者,如果您真的非常喜欢filter方法:

代码语言:javascript
运行
复制
profile = Profile.objects.filter(user=request.user).first()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71002481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档