2017-03-08 4 views
1

Genericビューを使用すると、djangoのきれいな機能がテンプレートに「このフィールドは必須です!」というエラーメッセージを表示します。フォームはGenericViewのように検証されます

私が理解しているところから、CreateViewはform_invalidというメソッドを継承しています。それはself.render_to_response(self.get_context_data(form=form))を返します。そして、私はそれが魔法をやっていることを推測していますか?

私はフォームを書いていますが、その機能を使用することも可能かどうか疑問に思っていましたか?

私はcustom_userモデルを作成し、簡単な作成機能を作成しようとしています。これまでのところ私が持っている:

Models.py

class Custom_User(AbstractBaseUser): 

    email = models.EmailField(max_length=250, unique=True) 
    password = models.CharField(max_length=100) 

    USERNAME_FIELD = 'email' 

をforms.py

class create_User_Form(forms.ModelForm): 

    confirm_password = forms.CharField(widget = forms.PasswordInput(attrs={'class' :'form-control'})) 

    class Meta: 
     model = Custom_User 
     fields = ['email', 'password'] 

     widgets = { 
        'email' : forms.TextInput(attrs={'class' :'form-control'}), 
        'password' : forms.PasswordInput(attrs={'class' :'form-control'}), 
     } 

    def clean(self): 
     cleaned_data = super(create_User_Form, self).clean() 
     password = cleaned_data.get("password") 
     confirm_password = cleaned_data.get("confirm_password") 

     if password != confirm_password: 
      raise forms.ValidationError(
       "password and confirm_password does not match" 
      ) 

     return self.cleaned_data 

urls.py

urlpatterns = [ 
      url(r'^$', views.index, name='index'),  

      url(r'^create_user/$', views.create_user, name='create_user'), 
] 

views.py

def create_user(request): 

    form = create_User_Form(request.POST) 

    if form.is_valid(): 
     print('valid') 
    else: 
     print('error')   

    return redirect('Eapp:index') 

def index(request): 

    create_user_form_ = create_User_Form() 

    context = { 
       'create_user_form' : create_user_form_, 
    } 

    return render(request, 'index.html', context) 
+0

です。[docs](https://docs.djangoproject.com/en/1.10/ref/class-based-views/generic)の 'CreateView'を見てください。 -editing /#django.views.generic.edit.CreateView)。 Viewクラスで 'form_class'を指定することができます。 –

+0

@gitblame私は本当にドキュメントを理解していない、それについてはごめんね。私はインデックスページをレンダリングするビュー関数を使って投稿を編集しました。それは私がCreateViewを表示したいものです。これは物事をさらに複雑にしますか? – vandelay

+0

チュートリアルが必要な場合は、godjangoの[CBVs]チュートリアル[https://godjango.com/15-class-based-views-part-1-templateview-and-redirectview/]チュートリアルを見ることをおすすめします。 –

答えて

2

関数ベースのビューとクラスベースのビューが混在しているようです。あなたが試みたのは、関数ベースビューです。完全にするために、これはあなたのインデックスを組み合わせ、彼らは一緒に行くために必要な機能が含まれているため、ユーザーのメソッドを作成することを、この

def create_user(request): 
    if request.method == 'POST': 
     create_user_form_ = create_User_Form(request.POST) 
     if form.is_valid(): 
      print('valid') 
      return redirect('Eapp:index') 
     else: 
      print('error')   

    else: 
     create_user_form_ = create_User_Form() 

    context = { 
       'create_user_form' : create_user_form_, 
    } 

    return render(request, 'index.html', context) 

ノートのように見える必要があります。

一方であなたがCreateViewあなたのコードを使用したい場合は

は実際にそれをだそれ

class UserCreate(CreateView): 
    model = Custom_User 
    form_class = create_User_Form 

たくさん短くなります。しかし、洗練を加えることができます。

注釈として。 Pythonでクラスを命名する標準的な方法は、 CreateUserForm

+0

答えをありがとう。私はもっ​​と物事を混ぜていた。私はViewが何らかの機能を追加したと思った。しかし、無効なフォームを返すと、エラーが表示されることがわかりました。フォームがそのように「リサイクル」できるとは考えていませんでした。 – vandelay

+1

助けてくれてうれしいです。あなたのプロジェクトで最高のもの – e4c5

関連する問題