Hiển thị Nội dung Trang Chủ trong Dự án Django

Chỉnh sửa tệp view.py

Nhập các lớp mô hình và sử dụng phương thức objects.all() để lấy thông tin cần hiển thị.

# Lấy thông tin từ cơ sở dữ liệu
# Lấy danh mục hàng hóa
categories = Category.objects.all()
# Lấy sản phẩm banner
banner_products = BannerProduct.objects.all()
# Lấy thông tin khuyến mãi
promotion_banners = PromotionBanner.objects.all()

Lưu ý rằng khi hiển thị danh sách sản phẩm theo danh mục, đây là một cấu trúc quan hệ chủ-từ (ảnh minh họa: khung đỏ là chủ, khung xanh là từ). Cần phải lặp qua hai lần: lần đầu tiên lặp qua các danh mục sản phẩm, sau đó lặp qua từng sản phẩm cụ thể trong mỗi danh mục. Các sản phẩm được chia thành hai loại hiển thị (display_type): loại hiển thị văn bản (display_type=0) và loại hiển thị hình ảnh (display_type=1).

Trong tệp template, vòng lặp đầu tiên dễ viết {% for category in categories %}, nhưng vòng lặp thứ hai {% for product in product_list %} khó nhận giá trị category cụ thể từ vòng lặp trên. Vì vậy, cách xử lý là gán danh sách sản phẩm làm thuộc tính của đối tượng category, như vậy có thể liên kết category cụ thể với sản phẩm của nó. Cách viết trong template sẽ là:

{% for category in categories %}
    <div>
        {% for product in category.products %}
        <li>....</li>
        {% endfor %}
    </div>
{% endfor %}

Vì vậy, trong tệp view.py, cần thêm hai thuộc tính cho category: text_banner chỉ hiển thị văn bản và image_banner chỉ hiển thị hình ảnh.

# Lấy thông tin hiển thị sản phẩm theo danh mục
for category in categories:
    # Lấy thông tin tiêu đề sản phẩm và sắp xếp
    text_banner = BannerProduct.objects.filter(category=category, display_type=0).order_by('index')
    # Lấy thông tin hình ảnh sản phẩm và sắp xếp
    image_banner = BannerProduct.objects.filter(category=category, display_type=1).order_by('index')
    # Thêm thuộc tính động cho category, lưu trữ thông tin văn bản và hình ảnh
    category.text_banner = text_banner
    category.image_banner = image_banner

Lấy số lượng giỏ hàng, định dạng lưu trữ giỏ hàng: cart_userid : {'goodsid': quantity}

cart_count = get_cart_count(request)

Context

context = { 'categories': categories, 'banner_products': banner_products, 'promotion_banners': promotion_banners, 'cart_count': cart_count } return render(request, self.template_name, context)

Chỉnh sửa tệp index.html

Cách viết khối hiển thị danh mục sản phẩm như sau:

{% for category in categories %}                                               
<div class="list_model">                                                       
    <div class="list_title clearfix">                                              
        <h3 class="fl" id="model{{ forloop.counter }}">{{ category.name }}</h3>        
        <div class="subtitle fl">                                                      
            <span>|</span>                                                             
            {% for text in category.text_banner %}                                       
            <a href="#">{{ text.product.name }}</a>                                 
            {% endfor %}                                                           
        </div>                                                                     
        <a href="#" class="goods_more fr" id="fruit_more">Xem thêm ></a>       
    </div>
    
    <div class="goods_con clearfix">                                               
        <div class="goods_banner fl"><img src="{{ category.image.url }}"></div>        
        <ul class="goods_list fl">                                                     
        {% for image in category.image_banner %}                                       
        <li>                                                                       
            <h4><a href="#">{{ image.product.name }}</a></h4>                        
            <a href="#"><img src="{{ image.product.image.url }}"></a>                
            <div class="prize">¥ {{ image.product.price }}</div>                 
        </li>                                                                  
        {% endfor %}                                                           
        </ul>                                                                  
    </div>                                                                 
</div>                                                                     
{% endfor %}                                                               

Lấy thông tin giỏ hàng

Vị trí lưu trữ

Thông tin giỏ hàng có thể được người dùng thay đổi thường xuyên, vì vậy không phù hợp để lưu trữ trong cơ sở dữ liệu quan hệ như MySQL. Có thể lưu trữ trong cơ sở dữ liệu trong bộ nhớ, như Redis.

Định dạng lưu trữ

Do chỉ cần lưu trữ hai trường thông tin là goods_id và số lượng, nên kiểu hash là phù hợp nhất. Key là cart_userid, field là goods_id, value là số lượng, tức là: cart_userid: {'goods_id', quantity}

Lấy số lượng giỏ hàng

Số lượng giỏ hàng là số lượng sản phẩm trong giỏ, tức là số phần tử trong hash. Phương thức này được sử dụng ở nhiều view, nên định nghĩa trong tệp utils.py

touch utils/utils.py

Thêm phương thức lấy số lượng giỏ hàng get_cart_count

from django_redis import get_redis_connection

def get_cart_count(request):
    '''Lấy số lượng giỏ hàng'''
    # Khởi tạo số lượng giỏ hàng
    cart_count = 0
    # Kiểm tra xem người dùng đã đăng nhập chưa
    user = request.user
    if user.is_authenticated:
        # Kết nối với Redis
        connect = get_redis_connection('default')
        # Tạo key
        cart_key = 'cart_%d' % (user.id)
        # Lấy số phần tử trong hash
        cart_count = connect.hlen(cart_key)
    return cart_count

Trong tệp goods/view.py, gọi phương thức này:

from utils.utils import get_cart_count
<br></br>def get(self, request):<br></br>  ......
  # Lấy số lượng giỏ hàng
  cart_count = get_cart_count(request)<br></br>  ......

Thẻ: Django Redis Template view model

Đăng vào ngày 21 tháng 6 lúc 18:54