2017-08-29 102 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的例子吗? –