关于新增地址会报错

来源:6-10 实现 地址编辑

丛从绿草

2020-09-24 17:03:55

http://img.mukewang.com/climg/5f6c60380962c35709340450.jpg

def address_list(request):
   """地址列表"""
   my_addr_list = UserAddress.objects.all()
   # (user=request.user, is_valid=True)
   return render(request, 'address_list.html', {
       'my_addr_list': my_addr_list
   })

def address_edit(request, pk):
   """地址新增或编辑"""
   # user = request.user
   # my_addr_list = UserAddress.objects.filter(user=pk)
   # print('my_addr_list', my_addr_list)
   if request.method == 'POST':
       form = UserAddressForm(request=request, data=request.POST)
       print('form', form)
       if form.is_valid():
           form.save()
           return redirect('accounts:address_list')
   else:
       form = UserAddressForm(request=request)
   return render(request, 'address_edit.html', {
       'form': form
   })

# 地址列表
url(r'^users/address/list/$', views.address_list, name='address_list'),
# 地址修改和编辑  users/address/edit/add/  users/address/edit/12/
url(r'^users/address/edit/(?P<pk>\S+)/$', views.address_edit, name='address_edit'),


class UserAddress(common.CommonModel):
   """用户的地址信息"""
   user = models.ForeignKey(User, related_name='user_address', on_delete=models.CASCADE)  # 一对多
   province = models.CharField('省份', max_length=32)
   city = models.CharField('市区', max_length=32)
   area = models.CharField('区域', max_length=32)
   twon = models.CharField('街道', max_length=32, null=True, blank=True)

   address = models.CharField('详细地址', max_length=64)
   username = models.CharField('收件人', max_length=16)
   phone = models.CharField('收件人的电话', max_length=32)

   is_default = models.BooleanField('是否为默认地址', default=False)
   is_valid = models.BooleanField('是否有效', default=True)

   def get_phone_format(self):
       """格式化手机号码"""
       return self.phone[0:3] + '****' + self.phone[7:]

   def get_region_format(self):
       """省市区"""
       # return "{0}{1}{2}{3}{4}".format(self.province, self.city, self.area, self.twon, self.address)
       return "{self.province} {self.city} {self.area}".format(self=self)
   class Meta:
       db_table = 'accounts_user_address'
       ordering = ['is_default', '-updated_at']


class UserAddressForm(forms.ModelForm):
   """地址新增或修改"""
   region = forms.CharField(label='大区域选项', max_length=64, required=True,
                            error_messages={
                                'required': '请选择地址'
                            })
   def __init__(self, request, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.request = request

   class Meta:
       model = UserAddress
       fields = ['address', 'username', 'phone', 'is_default']

   def clean_phone(self):
       """验证用户输入的手机号码"""
       # 判断用户名是否为手机号码,验证失败触发forms.ValidationError异常
       phone = self.cleaned_data['phone']
       pattern = r'^[1-9]{1}[0-9]{10}$'
       if not re.search(pattern, phone):
           raise forms.ValidationError('请输入正确的手机号码')
       return phone

   def clean(self):
       cleaned_data = super().clean()
       # 查询当前登录用户的地址数据
       addr_list = UserAddress.objects.filter(is_valid=True, user=self.request.user)
       if addr_list.count() >= 20:
           raise forms.ValidationError('最多只能添加20个地址')
       return cleaned_data

   def save(self, commit=True):
       obj = super().save(commit=False)
       region = self.cleaned_data['region']
       # 省市区的数据
       (province, city, area) = region.split('')
       obj.province = province
       obj.city = city
       obj.area = area
       obj.user = self.request.user


       # 修改的时候,如果已经有了默认地址,当前也勾选了默认地址选项
       # 需要把之前的地址都改为默认的地址
       if self.cleaned_data['is_default']:
           pass
       obj.save()

我新增收获地址, 点击提交为什么会这样 ?! 让我真的忍无可忍。

写回答

1回答

时间,

2020-09-24

同学,你好。访问新增地址页面是需要登录的,同学可以登录后再访问该页面

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~~~~

0

0 学习 · 3562 问题

查看课程