「Django 开发」Django 美多商城项目完整开发 4.0 第 11 篇:收货地址,安装(附代码文档)
在前面的文章中,我们已经完成了美多商城的基本功能的开发,包括用户注册、登录、商品浏览、搜索、购物车等。在本文章中,我们将继续开发收货地址的功能。
收货地址是一个非常重要的功能,它允许用户在下单时选择他们的收货地址,并且可以管理多个收货地址。在本文章中,我们将会详细介绍如何开发这个功能。
- 创建收货地址模型
首先,我们需要创建一个新的模型来存储收货地址的信息。我们可以在 apps.py 文件中添加如下代码:
“`python
from django.db import models
from django.contrib.auth.models import User
class Address(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
address = models.CharField(max_length=500)
zip_code = models.CharField(max_length=100)
is_default = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
“`
这里我们创建了一个 Address 模型,它有以下字段:
- user: 用户的外键,用于关联用户和收货地址。
- name: 收货人姓名。
- phone: 收货人电话号码。
- address: 收货地址。
- zip_code: 邮编。
- is_default: 是否为默认地址,默认为 False。
- created_at: 创建时间。
-
updated_at: 更新时间。
-
创建收货地址管理页面
接下来,我们需要创建一个新的 URL 和视图来处理收货地址的管理。我们可以在 urls.py 文件中添加如下代码:
“`python
from django.urls import path
from .views import AddressListView, AddressCreateView, AddressUpdateView, AddressDeleteView
urlpatterns = [
path(‘address/’, AddressListView.as_view(), name=’address_list’),
path(‘address/create/’, AddressCreateView.as_view(), name=’address_create’),
path(‘address//update/’, AddressUpdateView.as_view(), name=’address_update’),
path(‘address//delete/’, AddressDeleteView.as_view(), name=’address_delete’),
]
“`
这里我们创建了四个新的 URL,分别对应了 AddressListView、AddressCreateView、AddressUpdateView、AddressDeleteView 这四个视图。
然后,我们需要创建这四个视图,分别在 views.py 文件中添加如下代码:
“`python
from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .forms import AddressForm
from .models import Address
from django.contrib.auth.mixins import LoginRequiredMixin
class AddressListView(LoginRequiredMixin, ListView):
model = Address
template_name = ‘address_list.html’
context_object_name = ‘addresses’
paginate_by = 10
def get_queryset(self):
queryset = super().get_queryset()
queryset = queryset.filter(user=self.request.user)
queryset = queryset.order_by('-created_at')
return queryset
class AddressCreateView(LoginRequiredMixin, CreateView):
model = Address
form_class = AddressForm
template_name = ‘address_create.html’
success_url = reverse_lazy(‘address_list’)
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
class AddressUpdateView(LoginRequiredMixin, UpdateView):
model = Address
form_class = AddressForm
template_name = ‘address_update.html’
success_url = reverse_lazy(‘address_list’)
class AddressDeleteView(LoginRequiredMixin, DeleteView):
model = Address
template_name = ‘address_delete.html’
success_url = reverse_lazy(‘address_list’)
def get_object(self):
obj = super().get_object()
if obj.user != self.request.user:
raise Http404
return obj
“`
这里我们创建了四个新的视图,分别对应了 AddressListView、AddressCreateView、AddressUpdateView、AddressDeleteView 这四个视图。
- 创建收货地址列表页面
接下来,我们需要创建一个新的 HTML 文件来显示收货地址列表。我们可以在 templates 文件夹中创建一个新的文件,并在 address_list.html 文件中添加如下代码:
“`html
{% extends ‘base.html’ %}
{% block content %}
收货地址列表
{% if addresses %}
收货人 | 电话 | 地址 | 邮编 | 默认 | 操作 |
---|---|---|---|---|---|
{{address.name}} | {{address.phone}} | {{address.address}} | {{address.zip_code}} | {{address.is_default}} |
编辑 删除 |
{% if addresses.paginator.num_pages > 1 %}