如何基于app引擎中的复选框布尔值渲染项目...又名复选框地狱

时间:2013-12-10 04:03:35

标签: python google-app-engine web-applications checkbox

在待售商品页面上,我会在旁边显示带有复选框的项目。如果用户已选中一个或多个框并点击提交,我会重定向到购物车页面,其中仅显示已选中其复选框的项目。

现在我正在为每个项目建模:

class SellModel(db.Model):
    user = db.ReferenceProperty(UserModel)
    amount = db.StringProperty(required = True)
    price = db.StringProperty(required = True)
    checked = db.BooleanProperty(default = False)

    def render(self):
        return render_str("sellmodel.html", s = self)

和购物车

class CartModel(db.Model):
    user = db.ReferenceProperty(UserModel)
    cart_amount = db.StringProperty(required = True)
    cart_price = db.StringProperty(required = True)

    def render(self):
        return render_str("cartmodel.html", c = self)

销售页面的post方法如下所示:

    first_name = self.request.get('first_name')
    last_name = self.request.get('last_name')
    email = self.request.get('email')

    sells = SellModel.all().ancestor(sell_key()).order('price')

    boxcount = 0
    for sell in sells:
        check = self.request.get('check')

        if check:
            #checkbox was checked, update checked attribute
            sell.checked = True
            sell.put()
            boxcount += 1

    if boxcount == 0:
        error = "check at least one box"
        self.render("buy.html", error = error, sells = sells)


    else: #user has checked 1+ boxes
        #check if user exists
        database = UserModel.all().filter("email =", email)

        count = 0
        for data in database:
            if data.email == email:
                count = 1
        #user doesn't exist
        if count == 0:
            user = UserModel(parent = user_key(),
                first_name = first_name, last_name = last_name, 
                email = email)
            user.put()
        #user exists
        else:
            #make key, get user from key
            u = UserModel.gql('where email = :email', email = email)
            user = u.get()   

            cart_items = SellModel.all().ancestor(sell_key()).filter('checked = ', True)

            #loop through checked items
            for item in cart_items:
                #commit item to cart_key
                cart_amount = item.amount
                cart_price = item.price
                cart = CartModel(parent = cart_key(), user = user, cart_amount = cart_amount, cart_price = cart_price)
                cart.put()

        self.redirect('/contact')  

购物车页面的get方法:

cart = CartModel.all().ancestor(cart_key()).order('cart_price')
self.render("newbuy.html", cart = cart)

购物车页面html:

{% for item in cart %}
    {{ item.render() | safe }}
{% endfor %}

销售页面html

<form method = "post">
<div class = "section1">
    <div class = "sellbox">
        <h1>current offers:</h1>
        {%if sells.count() == 0 %}
        <div>
            it looks like all the offers have been bought. check back later 
        </div>
        {%else%}
            <table>
                <tr class = "table_label">
                <th></th>
                <th>amount of mp</th>
                <th>price per mp</th>
                </tr>
                {% for sell in sells %}
                    {{ sell.render() | safe }}
                {% endfor %}
            </table>


            <p class="big">
                <label>first name</label>
                <input type="text" name="first_name" value="{{first_name}}">


                <label>last name</label>
                <input type="text" name="last_name" value="{{last_name}}">


                <label>email</label>
                <input type="text" name="email" value="{{email}}">
            </p>

            <div><input type="submit" value="review your order"></div>
            <div class="error">{{error}}</div> 
        {%endif%}
    </div>
</div>
</form>

sellmodel.html

<tr>
<td class = "checkbox">
    <input type = "checkbox" name = "check">
</td>

<td class = "entry_amount" name = "entry">
    {{s.amount}}
</td>

<td class = "entry_price" name = "entry">
    {{s.price}}
</td>
</tr>

问题是无论选中哪个方框,每个销售项目都会显示在购物车页面上。当我查看数据存储区查看器中的cartmodel时,每个cartmodel实例的checked属性为true /每个sellmodel实例都已提交,即使有些已取消选中复选框。为什么数据库认为每个项目的复选框都被选中了?

1 个答案:

答案 0 :(得分:1)

更改此行:

check = self.request.get('check')

到此:

if 'check' in self.request:
    check = True
else:
    check = False

麻烦的是get()方法返回的值可能会也可能不会正确转换为布尔值。并且由于浏览器的默认行为是仅在选中复选框时才发布复选框值,因此上述代码应该一致地工作。