使用form_class的Django CreateView无法创建模型

时间:2017-08-29 12:12:06

标签: python django

我正在练习Django的两本Scoops书,我在CreateView中遇到了form_class的问题。如果我只使用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 %}

1 个答案:

答案 0 :(得分:1)

您的代码可能正常工作(看起来就是这样):

“它不是保存而不是重定向”:=当验证错误时会发生这种情况。

也覆盖infoDateRealis并打印一些日志输出。或者只是在模板中输出表单错误。

Django中验证错误的情况是,重新加载表单并将错误添加到模板上下文中,以便为用户呈现它们。

只是旁注:

替代

form_invalid

您只需将self.fields['title'].validators.append(validate_tasty) 方法直接添加到名为validate_tastyFlavorForm的{​​{1}}即可。这是添加自定义验证逻辑的Django标准方法。

clean_title