python - 当只有一个按钮应该出现时,两个按钮都会出现
问题描述
因此,当用户在他们的购物车中有该项目时,它应该显示从购物车中删除,当他们没有时添加到购物车,我正在尝试为此使用 django 模板语言,但是两个按钮都出现了,home
函数处理我的页面谈论,它将所有变量传递给home.html
.
主页.html
<h1>Here are products</h1>
<h1>{{ error }}</h1>
<h1>Your cart currently costs ${{ price }}</h1>
{% for book in books %}
<h3>{{ book.name }}</h3>
<img src= "/media/{{ book.image }}" alt="">
<p>{{ book.description }}</p>
{% for usercart in cart %}
{% if book == usercart.book %}
<form method="POST" action="/removefromcartforhome/">
{% csrf_token %}
<button type="submit" name="removeid" value="{{ book.id }}">remove item from cart</button>
</form>
{% else %}
<form method="POST" action="/addtocartforhome/">
{% csrf_token %}
<button type="submit" name="bookid" value="{{ book.id }}">Add to cart</button>
</form>
{% endif %}
{% endfor %}
{% endfor %}
视图.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from django.contrib.auth import login, logout, authenticate
from django.db import IntegrityError
from .models import Book, CartItem, OrderItem
from django.contrib.auth.decorators import login_required
from .forms import BookForm
from django.core.exceptions import ObjectDoesNotExist
import random
# Create your views here.
removederror = ''
def calculate(request):
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
def signupuser(request):
if request.user.is_authenticated:
return render(request, 'main/alreadyloggedin.html')
elif request.user != request.user.is_authenticated:
if request.method == "GET":
return render(request, 'main/signupuser.html', {'form':UserCreationForm()})
elif request.method == "POST":
if request.POST['password1'] == request.POST['password2']:
try:
user = User.objects.create_user(request.POST['username'], password=request.POST['password1'])
user.save()
login(request, user)
return render(request, 'main/UserCreated.html')
except IntegrityError:
return render(request, 'main/signupuser.html', {'form':UserCreationForm(), 'error':'That username has already been taken. Please choose a new username'})
else:
return render(request, 'main/signupuser.html', {'form':UserCreationForm(), 'error':'Passwords did not match'})
def signinuser(request):
if request.user.is_authenticated:
return render(request, 'main/alreadyloggedin.html', {'error':'You are already logged in'})
elif request.user != request.user.is_authenticated:
if request.method == "GET":
return render(request, 'main/signinuser.html', {'form':AuthenticationForm()})
elif request.method == "POST":
user = authenticate(request, username=request.POST['username'], password=request.POST['password'])
if user is None:
return render(request, 'main/signinuser.html', {'form':AuthenticationForm(), 'error':'Username and password did not match'})
else:
login(request, user)
return render(request, 'main/loggedin.html', {'error':'You are now logged in!'})
def logoutuser(request):
if request.user.is_authenticated:
if request.method == "GET":
return render(request, 'main/logoutuser.html')
elif request.method == "POST":
logout(request)
return render(request, 'main/loggedin.html', {'error':'You are now logged out!'})
elif request.user != request.user.is_authenticated:
return render(request, 'main/alreadyloggedin.html', {'error':'You are not logged in'})
def home(request):
if request.user.is_authenticated:
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
return render(request, 'main/home.html', {'books':books, 'price':fianlprice, 'error':'', 'cart':oof})
else:
books = Book.objects.all()
return render(request, 'main/home.html', {'books':books})
@login_required
def addtocartforhome(request):
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
if request.method == 'POST':
if CartItem.objects.filter(user=request.user, book=Book.objects.get(pk=request.POST['bookid'])).exists():
return render(request, 'main/home.html', {'books':books, 'error':'That book is already in your cart!', 'price':fianlprice})
else:
try:
book = Book.objects.get(pk=request.POST['bookid'])
except Book.DoesNotExist:
return redirect('home')
cart_item = CartItem.objects.create(book=book, user=request.user)
return redirect('home')
elif request.method == 'GET':
return render(request, 'main/signinuser.html', {'form':BookForm})
@login_required
def addtocartforproducts(request):
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
if request.method == 'POST':
if CartItem.objects.filter(user=request.user, book=Book.objects.get(pk=request.POST['bookid'])).exists():
return render(request, 'main/products.html', {'books':books, 'error':'That book is already in your cart!', 'price':fianlprice})
else:
try:
book = Book.objects.get(pk=request.POST['bookid'])
except Book.DoesNotExist:
return redirect('showproducts')
cart_item = CartItem.objects.create(book=book, user=request.user)
return redirect('showproducts')
elif request.method == 'GET':
return render(request, 'main/signinuser.html', {'form':BookForm})
@login_required
def removefromcartforcart(request):
if request.method == 'POST':
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
removebook = Book.objects.get(pk=request.POST['removeid'])
try:
cart_item = CartItem.objects.get(book=removebook, user=request.user).delete()
except ObjectDoesNotExist:
return render(request, 'main/cart.html', {'books':books, 'error':'That item is not in your cart!', 'price':fianlprice})
return redirect('showcart')
else:
pass
@login_required
def removefromcartforhome(request):
if request.method == 'POST':
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
removebook = Book.objects.get(pk=request.POST['removeid'])
try:
cart_item = CartItem.objects.get(book=removebook, user=request.user).delete()
except ObjectDoesNotExist:
removederror = 'That item is not in your cart!'
return redirect('home')
return redirect('home')
else:
pass
@login_required
def removefromcartforproducts(request):
if request.method == 'POST':
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
removebook = Book.objects.get(pk=request.POST['removeid'])
try:
cart_item = CartItem.objects.get(book=removebook, user=request.user).delete()
except ObjectDoesNotExist:
return render(request, 'main/products.html', {'books':books, 'error':'That item is not in your cart!', 'price':fianlprice})
return redirect('showproducts')
else:
pass
def showproducts(request):
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
books = Book.objects.all()
return render(request, 'main/products.html', {'books':books, 'price':fianlprice})
@login_required
def showcart(request):
oof = CartItem.objects.filter(user=request.user)
fianlprice = 0
for item in oof:
fianlprice += item.book.price
oof = CartItem.objects.filter(user=request.user)
return render(request, 'main/cart.html', {'cart':oof, 'price':fianlprice})
@login_required
def makeorder(request):
if request.method == 'POST':
request_cart = CartItem.objects.filter(user=request.user)
if not CartItem.objects.filter(user=request.user).exists():
return render(request, 'main/orderdone.html', {'error':'Your cart is empty'})
else:
for item in request_cart:
if OrderItem.objects.filter(user=item.user, book=item.book):
return render(request, 'main/orderdone.html', {'error':'You already own this book!'})
else:
for item in request_cart:
createorder(item.book, item.user)
request_cart.delete()
return render(request, 'main/orderdone.html', {'error':'Your order has been placed!'})
else:
return redirect('home')
def createorder(product, user):
order_item = Book.objects.get(pk=product.id)
order_user = User.objects.get(username=user.username)
unique_id = ''
for x in range(10):
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
numbers = ['1','2','3','4','5','6','7','8','9','10']
choice = random.randint(1,5)
if choice == 1:
unique_id += letters[random.randint(0,25)]
elif choice == 2:
unique_id += numbers[random.randint(0,9)]
elif choice == 3:
unique_id += letters[random.randint(0,25)]
elif choice == 4:
unique_id += numbers[random.randint(0,9)]
elif choice == 5:
unique_id += letters[random.randint(0,25)]
OrderItem.objects.create(user=order_user, book=order_item, order_id=unique_id)
模型.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Category'
verbose_name_plural = 'Categories'
class Book(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
image = models.ImageField()
price = models.IntegerField()
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name
class OrderItem(models.Model):
order_id = models.CharField(max_length=10)
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
book = models.ForeignKey(Book, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.user.username
class CartItem(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
book = models.ForeignKey(Book, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.user.username
解决方案
由于您的第二个“for”(如果“cart”长度> = 2),它显示了两个按钮。
在第二个“for”的迭代中,第一个“for”的“书”将落入“从购物车中删除”。剩下的,它将落入“从购物车添加”,因为它只会在“购物车”变量中出现一次。
如果您只是比较书籍,您可以在变量“购物车”中退回它们。所以这样,你就不需要第二个了。
像这样:
视图.py
def home(request):
if request.user.is_authenticated:
oof = CartItem.objects.filter(user=request.user).values_list('book', flat=True)
.
.
.
请注意,现在,您的变量“购物车”是书籍列表。所以你可以重命名变量
主页.html
{% for book in books %}
<h3>{{ book.name }}</h3>
<img src= "/media/{{ book.image }}" alt="">
<p>{{ book.description }}</p>
{% if book in cart %}
<form method="POST" action="/removefromcartforhome/">
{% csrf_token %}
<button type="submit" name="removeid" value="{{ book.id }}">remove item from cart</button>
</form>
{% else %}
<form method="POST" action="/addtocartforhome/">
{% csrf_token %}
<button type="submit" name="bookid" value="{{ book.id }}">Add to cart</button>
</form>
{% endif %}
{% endfor %}
这是考虑使用您的结构,而不是更改它。
推荐阅读
- python - 如何在使用随机时将子列表与其列表匹配?
- php - 如何从左连接表中获取下拉值
- vue.js - 如何在不调用 vue.js 中的方法的情况下从点击中显示项目?
- python - python selenium 无法定位子元素
- python - 使用 pandas df.query() 过滤分类(间隔)列
- yaml - 在 _config.yml 中创建 pdf 链接的语法是什么
- c++ - C++ 从另一个 C++ 文件“导入”一个枚举类
- sql - 如何使用随机序列的 B 中的值更新填充 A 表中的空字段
- python - Python 在 exec() 之后找不到执行的函数
- firebase - 链接 Firebase Firestore 文档/集合