如何在应用程序引擎中基于复选框布尔值呈现项目..也就是复选框地狱



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

现在我正在对每个项目进行建模:

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)

销售页面的张贴方式如下:

    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')  

购物车页面的获取方法:

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实例都已提交,尽管有些实例有未选中的复选框。为什么数据库认为每个项目的复选框都被选中了?

更改此行:

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

到此:

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

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

最新更新