【问题标题】:how do i validate unique mobile number in the seller model in Django我如何在 Django 的卖家模型中验证唯一的手机号码
【发布时间】:2017-02-19 17:50:15
【问题描述】:

我正在尝试验证模型卖家的 mobileno(唯一)。 但它给了我错误并且没有做想要的任务。
我应该怎么做才能在表格中检查 mobileno 的唯一性?
以下是我的model.py:

    class Seller(models.Model):
    mobilenno = models.DecimalField(max_digits=10, decimal_places=0, unique=True)  # Field name made lowercase.
    password = models.CharField(max_length=64)
    name = models.CharField( max_length=64)
  #  city = models.ForeignKey(City)
    address = models.CharField(max_length=512, blank=True, null=True)  # Field name made lowercase.
    phoneno = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True)  # Field name made lowercase.

和form.py

class SellerRegistrationForm(forms.Form):

    mobileno1 = forms.DecimalField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)),
                                  max_digits=10, decimal_places=0,label=_("Mobile Number"))
    password1 = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)),
                                label=_("Password"))
    password2 = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)),
                                label=_("Password (again)"))
    name = forms.CharField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)),
                                 label=_("Seller Name"))
    address = forms.CharField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)),
                                 label=_("Seller Address"))
    phoneno = forms.DecimalField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)),
                                 max_digits=10, decimal_places=0, label=_("Phone Number"))

    def clean_mobileno1(self):

        try:
            Seller.objects.get(mobileno=self.cleaned_data['mobileno1'])
        except Seller.DoesNotExist:
            return self.cleaned_data['mobileno1']
        raise forms.ValidationError(_("The mobilenumber already exists. Please try another one."))

    def clean(self):
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError(_("The two password fields did not match."))
        return self.cleaned_data

views.py

def seller_register(request):
    if request.method == 'POST':
        form = SellerRegistrationForm(request.POST)
        if form.is_valid():
            Seller.objects.create(
                mobilenno=form.cleaned_data['mobileno1'],
                password=form.cleaned_data['password1'],
                name=form.cleaned_data['name'],
                address=form.cleaned_data['address'],
                phoneno=form.cleaned_data['phoneno']
            )
            return HttpResponseRedirect('/register/success/')
    else:
        form = SellerRegistrationForm()

    return render(request,'registration/register.html', {'form': form })

【问题讨论】:

    标签: django django-models django-forms django-validation


    【解决方案1】:

    不清楚您遇到了什么错误,所以我不确定错误在哪里,但clean_mobileno1 看起来是个不错的选择。检查mobilennomobileno1 之间的命名一致性。

    该函数中的逻辑很难遵循,您尝试捕获“正常”用例的异常,然后如果您没有捕获第一个异常,则引发异常,这似乎违反直觉。此外,您正在检查 python 中的唯一性,何时应该将其推送到数据库(字段定义中的unique=True 应该为您强制执行)。

    我建议您将https://github.com/stefanfoulis/django-phonenumber-field 用作电话号码,而不是Decimal。您将获得实际的电话号码验证,以及一系列非常有用的电话特定功能。后端基于 Android 的电话号码库,因此往往保持最新状态。

    你的模型变成:

    from phonenumber_field.modelfields import PhoneNumberField
    
    class Seller(models.Model):
        mobileno = PhoneNumberField(unique=True)
        ...
    

    此外,您可能应该在表单中使用ModelForm

    class SellerRegistrationForm(forms.ModelForm):
        class Meta:
            model = Seller
    
        ...
    

    【讨论】:

    • 我可以使用字符字段来存储带有正则表达式的手机号码
    • 我想将字段默认设置为 10 位数字/字符
    • 显然你可以,但是为什么要重新发明轮子,除非你的用例没有被已经存在了一段时间并且被证明有效的东西所覆盖?
    猜你喜欢
    • 2021-11-01
    • 2021-11-23
    • 2016-10-12
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多