首页 > 解决方案 > 当只有一个按钮应该出现时,两个按钮都会出现

问题描述

因此,当用户在他们的购物车中有该项目时,它应该显示从购物车中删除,当他们没有时添加到购物车,我正在尝试为此使用 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


标签: pythondjango

解决方案


由于您的第二个“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 %}

这是考虑使用您的结构,而不是更改它。


推荐阅读