2017-03-17 21 views
0

私が現在取り組んでいるシステムでは、登録時に2つの緊急連絡先番号を入力する必要があります。私は、ユーザーが有効な番号を入力していることを確認するチェックを実装したい、私はこれが0か+で始まる文字列であると判断した。これを行うために、私はフォームのクリーンメソッドをオーバーライドしようとしましたが、それはかなり動作していません。私のDjango ModelFormのCleanメソッドをオーバーライド

これは、関連する方法のための私のforms.pyコードです(今更新し、エラーが下記の投げ。):

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('emergcon1', 'emergcon2') 
     labels = { 
      'emergcon1': ('Emergency Contact Number'), 
      'emergcon2': ('Emergency Contact Number 2') 
     } 

    def clean_emergcon1(self): 
     emergcon1 = self.cleaned_data['emergcon1'] 
     print emergcon1 
     if emergcon1[:1] != '0' or '+': 
     raise ValidationError(
      _('%(emergcon1)s is not a valid phone number'), 
      params={'emergcon1': emergcon1}, 
     ) 
     return emergcon1 
    def clean_emergcon2(self): 
     emergcon2 = self.cleaned_data.['emergcon2'] 
     if emergcon2[:1] != '0' or '+': 
     raise ValidationError(
      _('%(emergcon2)s is not a valid phone number'), 
      params={'emergcon2': emergcon2}, 
     ) 
     return emergcon2 

views.py: DEF(要求)を登録します。

登録=偽
if request.method == 'POST': 
     user_form = UserForm(data=request.POST) 
     profile_form = UserProfileForm(data=request.POST) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save() 

      user.set_password(user.password) 
      user.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 
      profile.save() 

      registered = True 

     else: 
      print(user_form.errors, profile_form.errors) 

    else: 
     user_form = UserForm() 
     profile_form = UserProfileForm() 

    return render(request, 'tennis/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered':registered}) 

models.py:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 

    emergcon1 = models.CharField(max_length=128, blank=False) 
    emergcon2 = models.CharField(max_length=128, blank=False) 

    def _unicode_(self): 
     return self.user.username 
     return self.emergcon1 
     return self.emergcon2 

マイレジスタ。 HTML:

{% extends 'tennis/base.html' %} 
{% load staticfiles %} 

{% block body_block%} 

    {% block title_block %} 
     Registration 
    {% endblock %} 

    <body> 
     <h1>Register Here</h1> 
     {% if registered %} 
      <strong> Thank you for registering</strong> 
      <a href="{% url 'index' %}"> Return to homepage </a><br /> 

     {% else %} 
      <form id="user_form" method="post" action="{% url 'register' %}"> 

      {% csrf_token %} 

      <!-- displays forms --> 
      {{ user_form.as_p }} 
      {{ profile_form.as_p }} 

      <!-- adds submit button --> 
      <input type="submit" name="submit" value="Register" /> 
     </form> 
     {% endif %} 
    </body> 
{% endblock %} 

フル・エラートレースバック、エラーグローバル名 '_' が定義されていません。

Internal Server Error: /tennis/register/ 
Traceback (most recent call last): 
    File "/home/steph/.virtualenvs/tennis/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/steph/.virtualenvs/tennis/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/steph/Documents/project/tennis_system_project/tennis/views.py", line 29, in register 
    if user_form.is_valid() and profile_form.is_valid(): 
    File "/home/steph/.virtualenvs/tennis/local/lib/python2.7/site-packages/django/forms/forms.py", line 161, in is_valid 
    return self.is_bound and not self.errors 
    File "/home/steph/.virtualenvs/tennis/local/lib/python2.7/site-packages/django/forms/forms.py", line 153, in errors 
    self.full_clean() 
    File "/home/steph/.virtualenvs/tennis/local/lib/python2.7/site-packages/django/forms/forms.py", line 362, in full_clean 
    self._clean_fields() 
    File "/home/steph/.virtualenvs/tennis/local/lib/python2.7/site-packages/django/forms/forms.py", line 383, in _clean_fields 
    value = getattr(self, 'clean_%s' % name)() 
    File "/home/steph/Documents/project/tennis_system_project/tennis/forms.py", line 30, in clean_emergcon1 
    _('%(emergcon1)s is not a valid phone number'), 
NameError: global name '_' is not defined 

は解決済み、

"_としてdjango.utils.translationインポートugettext_lazyからのインポート" として固定

新しい問題:0で始まる数字が有効であると認識されていません。私は07896428317とそれを提供し、私はそれが私に "07896428317は有効な電話番号ではありません"提出をクリックしたとき。

+0

は 'のenctypeを削除します=」 multipart/form-data "を完全に削除します。 –

+0

あなたはどのバージョンの 'clean'を使用していますか?あなたの質問で私が見ているものか、私の答えにあるものは? –

+0

あなたは 'django.utils.translation import ugettext_lazy as _'から'が欠けているようです。私の答えを更新しました。ご希望の場合は、コメントの一部を削除してください。彼らは十分になっています... –

答えて

0

あなたは、このようなロジックを書き換えることができ、相互に依存しないフィールドに-検証することがclean()メソッドの内部で、つまりはclean_<field_name>メソッドを使用するので:

from django.utils.translation import ugettext_lazy as _ 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     # as is 

    def clean_emergcon1(self): 
     """ Validation of emergcon1 specifically """ 
     emergcon1 = self.cleaned_data['emergcon1'] 
     if emergcon1[:1] not in ['0', '+']: 
      raise ValidationError(
       _('%(emergcon1)s is not a valid phone number'), 
       params={'emergcon1': emergcon1}, 
      ) 
     # Always return a value to use as the new cleaned data, even if 
     # this method didn't change it. 
     return emergcon1 

    def clean_emergcon2(self): 
     """ Validation of emergcon2 specifically """ 
     emergcon2 = self.cleaned_data['emergcon2'] 
     if emergcon2[:1] not in ['0', '+']: 
      raise ValidationError(
       _('%(emergcon2)s is not a valid phone number'), 
       params={'emergcon2': emergcon2}, 
      ) 
     # Always return a value to use as the new cleaned data, even if 
     # this method didn't change it. 
     return emergcon2 
+0

同じ問題が依然として残っていますが、完全なトレースバックで質問が更新されました。 –

+0

'emergcon1 = self.cleaned_data ['emergcon1']'の後に 'print(emergcon1)'を追加してもよろしいですか? –

+0

print( 'emergcon1')を指定すると、emergcon1という単語が端末に表示されますが、エラートレースバックは同じです。また、私のモデルのコードが役立つ場合に追加されました。 –

関連する問題