11用户中心--地址页
user/urls.py
from django.urls import path
from .import views
urlpatterns = [
path(\'register/\',views.RegisterView.as_view()), # 注册
path(\'active/<token>\',views.ActiveView.as_view()), # 用户激活
path(\'login/\',views.LoginView.as_view()), # 登录
path(\'login_out/\',views.LoginOut.as_view()), # 退出登录
path(\'\',views.UserInfoView.as_view()), # 用户中心-个人信息
path(\'order/\',views.UserOrderView.as_view()), # 用户中心-全部订单
path(\'address/\',views.UserAddress.as_view()), # 用户中心-收货地址
]
user/views.py
class UserAddress(View):
\'\'\'用户中心-地址页\'\'\'
def get(self, request):
if \'user\' not in request.session:
return redirect(\'/user/login/\')
# 获取用户默认收货地址
user = jsonpickle.loads(request.session.get(\'user\',\'\'))
try:
address = Address.objects.get(user=user,is_default=True)
except Address.DoesNotExist:
# 不存在默认收货地址
address = None
return render(request, \'user_center_site.html\',{\'page\':\'address\',\'address\':address})
def post(self,request):
# 接受数据
receiver = request.POST.get(\'receiver\', \'\')
addr = request.POST.get(\'addr\', \'\')
zip_code = request.POST.get(\'zip_code\', \'\')
phone = request.POST.get(\'phone\', \'\')
# 校验数据
if not all([receiver,addr,zip_code,phone]):
return render(request,\'user_center_site.html\',{\'errmsg\':\'信息不完整\'})
# 验证手机号
if not re.match(r\'^1[3|4|5|7|8][0-9]{9}$\',phone):
return render(request, \'user_center_site.html\', {\'errmsg\': \'手机格式错误\'})
# 获取session
user = jsonpickle.loads(request.session.get(\'user\'))
# 添加地址
# 如果用户已存在默认收货地址,添加的地址不作为默认收货地址,否则作为默认收货地址
try:
address = Address.objects.get(user=user,is_default=True)
except Address.DoesNotExist:
# 不存在默认收货地址
address = None
# 如果存在默认收货地址
if address:
is_default = False
else:
is_default = True
# 添加地址
Address.objects.create(user=user,receiver=receiver,addr=addr,zip_code=zip_code,phone=phone,is_default=is_default)
return redirect(\'/user/address/\')
user_center_site.html
<div class="site_con">
<dl>
<dt>当前地址:</dt>
{% if address %}
<dd>{{ address.addr }} ({{ address.receiver }})收 {{ address.phone }}</dd>
{% else %}
<dd>无默认地址</dd>
{% endif %}
</dl>
</div>