2017-08-29 97 views
0

我正在從兩勺Django的書中練習,我在CreateView中有form_class的問題。如果我只使用CreateView中的字段,它將保存模型,如果我使用form_class,它不會保存,也不會重定向。Django的CreateView與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中發生驗證錯誤,會發生什麼情況是表單重新加載,並且將錯誤添加到模板上下文中,以便可以爲用戶呈現它們。


只是一個側面說明:

作爲替代

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

你可以簡單地直接添加validate_tasty方法你​​名稱clean_titleclean_slug下。這是添加自定義驗證邏輯的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

啊,現在我知道了,在slug字段中,我正在寫這樣美味的食物,這就是爲什麼它沒有渲染。 –

+0

你能寫一個clean_title的例子嗎? –