繁体   English   中英

在 django 形式的特定字段上循环

[英]Looping over a specific field in a django form

通过创建类似 eBay 的投标应用程序来学习 Django。

我的一个模型是简单的出价 class,它将记录每个用户对特定列表的出价。

模型.py

class Bid(models.Model):
    bid = models.DecimalField(max_digits=10, decimal_places=2)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE)

forms.py

def listing_view(request, id):

    form = BidForm(request.POST or None)

    if form.is_valid():

        instance = form.save(commit=False)
        instance.user = request.user
        instance.listing_id = id

        # check bid is higher than starting bid or other bids or flash error message
        current_bid = instance.bid
        starting_bid = instance.listing.starting_bid
        query = Bid.objects.all().filter(listing=id)

在 forms.py 中,我正在编写一个视图来验证用户输入的出价是否大于现有出价。 它不完整,因为我坚持创建这个比较。

简单的方法是遍历“查询”变量并进行比较,但有更优雅的解决方案吗?

我找到了一个使用 all() function 的解决方案,类似于:

all(current_bid > i in my_list)

但这仅适用于与列表进行比较,不适用于表单对象

有没有办法循环查询(即查询中的每个)并检查 current_bid 是否大于 1 行中的所有“each.bid”?

像这样的东西:

all(current_bid > i for i.bid in query)

可悲的是,这不起作用。 我得到一个 NameError - name 'i' 没有定义。

谢谢!

这一行在这里:

all(current_bid > i for i.bid in query)

需要改成这样:

all(current_bid > i.bid for i in query)

有时列表推导令人困惑,所以我喜欢把它们想象成正常的 for 循环。 这是我对您尝试做的事情的解释(不保证正确性):

is_biggest_bid = True
for i in query:. # writing i.bid wouldn't make sense here
    if i.bid > current_bid:
        is_biggest_bid = False
        break

希望有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM