在待售商品页面上,我会在旁边显示带有复选框的项目。如果用户已选中一个或多个框并点击提交,我会重定向到购物车页面,其中仅显示已选中其复选框的项目。
现在我正在为每个项目建模:
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实例都已提交,即使有些已取消选中复选框。为什么数据库认为每个项目的复选框都被选中了?
答案 0 :(得分:1)
更改此行:
check = self.request.get('check')
到此:
if 'check' in self.request:
check = True
else:
check = False
麻烦的是get()方法返回的值可能会也可能不会正确转换为布尔值。并且由于浏览器的默认行为是仅在选中复选框时才发布复选框值,因此上述代码应该一致地工作。