2017-03-17 88 views
0

我目前正在使用的系統需要用戶在註冊時輸入兩個緊急聯繫人號碼。我想執行一個檢查來確保用戶輸入一個有效的數字,我確定這是一個以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: 高清登記(請求):註冊 =假

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 =」多部分/形式數據「完全。 –

+0

您使用的是哪個版本的'clean'?我在你的問題中看到的那個還是我的答案中的那個? –

+0

看來你缺少'from 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)'?帶打印('emergcon1')的 –

+0

單詞emergcon1打印在終端中,錯誤追溯是相同的。如果有幫助,還添加我的模型代碼。 –

相關問題