2016-03-19 8 views
0

私はdjangoでWebアプリケーションを構築しています。次のような名前にテンプレート内でのdjangoモデルの検証エラー

<form method="post" action="/voting/add_state/">{% csrf_token %} 
    State name:<br> 
    <input type="text" name="state_name"><br> 
    <input type="submit" value="Submit"> 
</form> 

をmodels.pyでは、私が追加したユニークな制約の検証:その一環として、私は次のように1つのHTMLフォームを作成した

だから、重複名の
class State(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    vote_counted = models.BooleanField(default=False) 

、それはスロー私がテンプレートで取りたいユニークな制約エラーです。誰でも提案をお願いしますか?

+0

どのようにPOSTデータを保存していますか?関連するコードを投稿できますか? – Selcuk

+0

@Selcuk、私は彼がDjangoのデフォルト保存メソッドから何も修正していないと思います。 –

+0

@ChuckLoganLimテンプレートのようには見えません。 – Selcuk

答えて

0

DjangoにはFormの処理が組み込まれています.Djangoには "Model Forms"というモデルが自動的にレンダリングされます。ビューを通過させてコンテキスト内で参照すると、自動的にhtmlが生成されますが、テンプレートでレンダリングされる内容をより詳細に制御したい場合は、Django Model Formが生成するフォーム属性を参照できます。

Djangoがフォームを構築するために提供するフレームワーク内での作業を強くお勧めします。フォームの構築、検証、抽象化のための定型コードを多く提供しており、特にこれらのような単純なフォームには有能です。ここ

は一例であり:

models.py

class State(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    vote_counted = models.BooleanField(default=False) 

forms.py

class StateForm(forms.ModelForm): 
    model = State 
    fields = (name,) 

views.py

from django.views.generic.edit import FormView 

class StateForm(FormView): 
    template_name = 'state_form.html' 
    form_class = StateForm 
    success_url = '/thanks/' 

STA te_form.html(自動生成されたフォームの一例)

{{ form }} 

state_form.html(カスタム形式の例)

<form action="/" method="post"> 
    {% csrf_token %} 
    {{ form.errors }} 
    {% for field in form %} 
     <input type="{{ field.type }}" name='{{ field.name }}' class="submit" value="{{ field.value}}"> 
    {% endfor %} 
    <input type="submit" name='submit" value="Submit"> 
</form> 

参照:

ジャンゴフォーム: https://docs.djangoproject.com/en/1.9/topics/forms/

ジャンゴモデルフォーム:https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/

Djangoのジェネリックビュー: https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView

0

は今、あなたの意見

#views.py 
from django.views.generic import FormView 
from .forms import StateForm 

class MyView(FormView): 

    template_name = 'template.html' 
    form_class = StateForm 
    success_url = '/my-url-to-redirect-after-submit/' 

テンプレートにこのフォームを使用して、モデル

#forms.py 
from django import forms 
from .models import State 

class StateForm(forms.ModelForm): 

    class Meta: 
     model = State 
     fields = ('name',) 

に基づいてフォームを作成します。HTML

<form method="post"> 
    {% csrf_token %} 
    Name 
    {{ form.name }} 
    {{ form.name.errors }} 
    <input type="submit" value="Create"> 
</form> 
0

ユーザーが重複した名前と試みるので、もしあなたが、フォームは、このようなメッセージに何かを上げ、Stateモデル用のフォームを作成し、バリデータを作成することができます。

models.py 
class State(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    vote_counted = models.BooleanField(default=False) 

forms.py 
def unique_name(value): 
    exist = State.objects.filter(name=value) 
    if exist: 
     raise ValidationError(u"A state with the name %s already exist" % value) 

class StateForm(forms.Form): 
    name = forms.CharField(label=('Name:'), validators=[unique_name]) 

次に、あなただけのテンプレートのStateFormをレンダリングする必要があります。

関連する問題