【问题标题】:Using regular expression for a field name in a Django在 Django 中使用正则表达式作为字段名
【发布时间】:2021-11-12 10:38:24
【问题描述】:

我在 Django 中有一个模型,其中包含字段 photo_1photo_2photo_3 和许多其他字段,它们的名称中不包含“照片”字符串。此外,照片字段可以是空白的,因此我可以找到一些带有空白照片字段的行。对于 html 模板,有没有办法遍历名为“^photo_[0-9]*$”的字段并仅选择那些不为空的字段?

这就是我的意思:

# views.py file

def listing(request, listing_id):
    listing = get_object_or_404(Listing, pk=listing_id)
    
    context = {
        'listing': listing
    }

    return render(request,"listings/listing.html", context)
# listsing.html file

    <div class="col-md-2">
        <a href="{{listing.photo_n.url}}" data-lightbox="home-images">
            <img src="{{listing.photo_n.url}}" alt="" class="img-fluid">
        </a>
    </div>

我想通过“listing”查询集,搜索名为“^photo_[0-9]*$”的字段,如果该字段的值不为空,则将其传递给 ref=" {{}}" 和 src="{{}}" tks

【问题讨论】:

  • 这看起来像是错误的建模。通常为照片制作一个额外的模型,然后让该模型链接到您的Listing 模型对象。这样,如果Listing 没有照片,那么它会更紧凑,并且枚举它更方便。

标签: python django regex


【解决方案1】:

通常不是创建一个包含大量 photo_i 字段的模型是一个好主意:这意味着数据库需要存储很多字段,其中大部分字段可能是是空的,但它使查询更加困难(例如,查找包含某张照片的Listing 对象将导致查询较长),而且最终您可能需要一个带有额外照片的Listing

为了实现Listing 可以包含任意数量的照片的功能,需要制作一个具有photo 字段的额外模型,并通过ForeingKey 链接到Listing 对象。

这意味着模型看起来像:

class Listing(models.Model):
    # no photo_i items
    # …
    pass

class ListingPhoto(models.Model):
    listing = models.ForeignKey(
        Listing,
        on_delete=models.CASCADE,
        related_name='photos'
    )
    photo = models.ImageField()

然后您可以使用以下方式渲染照片:

<div class="col-md-2">
    {% for photo in listing.photos.all %}
    <a href="{{ photo.photo.url }}" data-lightbox="home-images">
        <img src="{{ photo.photo.url }}" alt="" class="img-fluid">
    </a>
</div>

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 2022-12-15
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多