2017-02-19 1 views
0

における売り手モデルに独自の携帯電話番号を検証します。 しかし、それは私にエラーを与え、希望の仕事をしていない。私は何をすべき
はそうmobilenoの独自性は、フォームにチェックされていますか?
次は私のmodel.pyです:は、どのように私は、私はモデルの販売のmobileno(ユニーク)を検証しようとしていますジャンゴ

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 }) 

答えて

0

それはあなたが取得している何のエラーは明らかではありませんので、私は」どこにエラーがあるのか​​分かりませんが、clean_mobileno1は良い候補のようです。 mobilennomobileno1の間の整合性を確認してください命名。

この関数のロジックは、「通常の」ユースケースの例外をキャッチして、最初のものをキャッチしないと例外を送出しようとすると直感的ではないようです。また、あなたはそれが本当に(自分のフィールド定義でunique=Trueはあなたのためにそれを強制する必要があります)データベースにプッシュしなければならないとき、Pythonで単一性のチェックをやっています。

私はあなたの代わりにDecimalの、電話番号のhttps://github.com/stefanfoulis/django-phonenumber-fieldを使用することをお勧め。あなたは実際の電話番号の検証と非常に便利な電話固有の機能の束を得るでしょう。バックエンドはAndroidの電話番号ライブラリに基づいているため、最新の状態に保たれる傾向があります。

あなたのモデルは次のようになります。

from phonenumber_field.modelfields import PhoneNumberField 

class Seller(models.Model): 
    mobileno = PhoneNumberField(unique=True) 
    ... 

をまた、あなたはおそらく、あなたのフォームにModelFormを使用する必要があります。

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

    ... 
+0

は私が設定したい正規表現 –

+0

モバイルノーを格納する文字フィールドを使用できますご利用の場合は、しばらくの間、回避されていると動作するように証明されてい何かで覆われていない場合を除き10桁/文字 –

+0

へのフィールドのデフォルト値は、明らかに、あなたは、なぜ、車輪の再発明することができますか? –

関連する問題