【问题标题】:Django Views Incrementing VariablesDjango 视图递增变量
【发布时间】:2013-09-27 06:13:31
【问题描述】:

当我增加一个变量时,它只会增加到 2 而不是 3。默认值为 1。我不确定我缺少什么。任何帮助表示赞赏。

def unanswered(request, template ='unanswered.html'):
    phone_number = Pool.objects.order_by('?')[0]
    pool = Pool.objects.order_by('?')[0]
    pool_list = Pool.objects.all()
    number_attempts = Pool.objects.filter(phone_number=phone_number).count()


    # unanswer number action

        if pool_list:
            if number_attempts > 3:
                return number_attempts

            else:
                x = number_attempts
                x += 1 
                print x 'returns 2'
                store = Pool(id=phone_number.id,
                             phone_number = phone_number.phone_number,
                             un_answered=x, answered=0)
                store.save()

    payload = {'pool':pool,}

    return render_to_response(template, payload, context_instance=RequestContext(request))

【问题讨论】:

  • 从你的问题我猜不出number_attemptselse 块中的值是多少。如果是1,那么x +=1 确实应该返回2。 :-)
  • number_attempts,它计算它获得的确切 phone_number 的数量。所以默认它是1,然后我想保持递增直到它达到3。

标签: python django operators increment


【解决方案1】:

您的代码中没有任何for loopwhile loop,因此如果初始number_attempts 为1,它将递增到2 并完成流程。

我看到您想将尝试存储在数据库中,但您的做法不正确。您将id=phone_number.id 传递给Store(...),如果存在给定id,它将尝试更新现有记录。所以Pool.objects.filter(phone_number=phone_number).count() 总是返回 1。

你可能想把它改成

store = Pool(phone_number = phone_number.phone_number,
             un_answered=x, answered=0)

所以对于下一个请求,Pool.objects.filter(phone_number=phone_number).count() 会给你 2 个。


评论后更新:

我只想从 1,2,3 更新 un_answered 字段。

在这种情况下,不要使用.count() 来获取失败尝试的次数,请使用具有该计数器的对象中的字段。

所以不是

number_attempts = Pool.objects.filter(phone_number=phone_number).count()

你可以这样做

try:
    store = Pool.objects.get(phone_number=phone_number)
    number_attempts = store.un_answered

# FIX : the original code used a bare except clause.
# Bare except clauses are EVIL. DONT use bare except clauses. NEVER.
# Or thou shall burn in the flames of hell for your eternal death....

except Pool.DoesNotExist:
    store = Pool(phone_number = phone_number.phone_number,
                 un_answered=1, answered=0)
    store.save()
    number_attempts = 1

...
if pool_list:
        if number_attempts > 3:
            return number_attempts

        else:
            x = number_attempts
            x += 1 
            print x 'returns 2'
            store.un_answered = x
            store.save()

【讨论】:

  • 这不是我想要的方式。它一遍又一遍地创建相同的电话号码。我想要的只是从 1、2、3 更新 un_answered 字段。这就是我添加 ID 的原因,它只是更新记录,而不是创建新记录。
  • @Infinixd,在这种情况下检查更新的答案。顺便说一句,指定id 来创建对象通常不是一个好主意。
  • @Rohan :请不要发布带有 except 子句的代码 sn-ps。裸 except 子句是邪恶的。永远不要假设您知道引发了哪个异常。在上述情况下(已修复),您只想捕获 Pool.DoesNotExist 而没有别的。
  • @brunodesthuilliers,我同意,但从 OP 假设很多。此处发布的代码是解决问题的示例。
  • @Infinixd,这是因为 django 视图应该返回 HTTPResponse 类型的变量,而 number_attempts 不是。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2019-07-24
  • 2021-09-13
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2011-11-28
相关资源
最近更新 更多