2017-08-29 11 views
0

私はDjangoの2つのスクープから練習していますが、私はCreateViewのform_classに問題があります。 CreateViewでフィールドを使用している場合はモデルを保存していますが、form_classを使用している場合は保存もリダイレクトもしません。Django CreateView with form_class

私はバリデータを練習するためにform_classを使用しています。

views.py

class FlavorCreateView(LoginRequiredMixin, CreateView): 
    model = Flavor 
    success_url = '/flavors/list/' 
    template_name = 'flavor_create.html' 
    success_msg = 'Flavor created.' 
    form_class = FlavorForm 
    # fields = ['title', 'slug', 'scoops_remaining'] 

    def form_valid(self, form): 
     form.instance.created_by = self.request.user 
     return super(FlavorCreateView, self).form_valid(form) 

forms.py

class FlavorForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(FlavorForm, self).__init__(*args, **kwargs) 
     self.fields['title'].validators.append(validate_tasty) 
     self.fields['slug'].validators.append(validate_tasty) 

    class Meta: 
     model = Flavor 
     fields = ['title', 'slug', 'scoops_remaining'] 

validators.py

def validate_tasty(value): 
    """ 
    Raise a ValidationError if the value doesn't start with the word 'Tasty'. 
    """ 
    if not value.startswith('Tasty'): 
     msg = 'Must start with Tasty' 
     raise ValidationError(msg) 

flavor_create.html

{% extends 'base_flavor.html' %} 

{% block content %} 

<form action="" method="POST">{% csrf_token %} 
    <p style="color: red;">{{ form.title.errors.as_text }}</p> 
    {% for field in form %} 
     <p>{{ field.label }}: {{ field }}</p> 
    {% endfor %} 
    <button type="Submit">Salveaza</button> 

</form> 

    <a href="{% url 'flavors:list_flavor' %}">Return home</a> 
{% endblock %} 
+0

ビューでsave()が不足している可能性があります。 – harmaahylje

答えて

1

あなたのコードはおそらくちょうど期待どおりに動作します(そのように見えます):

「保存していないし、リダイレクトしていません」というのは、検証エラーが発生した場合です。

form_invalidも上書きし、ログ出力をいくつか出力します。または、テンプレートのフォームエラーを出力するだけです。

Djangoで検証エラーが発生した場合、フォームが再読み込みされ、エラーがテンプレートコンテキストに追加され、ユーザーに表示されるようになります。

ただ、サイドノート

:あなたは、単に名前clean_titleclean_slugの下であなたの​​に直接validate_tastyメソッドを追加することができます

self.fields['title'].validators.append(validate_tasty) 

に代わるものとして

。これはカスタム検証ロジックを追加するためのDjangoの標準的な方法です。

class FlavorForm(forms.ModelForm): 

    def clean_title(self): 
     # even if this is a required field, it might be missing 
     # Django will check for required fields, no need to raise 
     # that error here, but check for existence 
     title = self.cleaned_data.get('title', None) 
     if title and not value.startswith('Tasty'): 
      msg = 'Must start with Tasty' 
      raise ValidationError(msg): 
     return title 

    class Meta: 
     model = Flavor 
     fields = ['title', 'slug', 'scoops_remaining'] 
+0

ああ今、私はそれを得ました、スラグ場で私はこの「おいしい」のような美味しいものを書いていたので、それがレンダリングされていませんでした。 –

+0

あなたはclean_titleの例を書くことができますか? –

関連する問題