我正在练习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 %}
答案 0 :(得分:1)
您的代码可能正常工作(看起来就是这样):
“它不是保存而不是重定向”:=当验证错误时会发生这种情况。
也覆盖infoDateRealis
并打印一些日志输出。或者只是在模板中输出表单错误。
Django中验证错误的情况是,重新加载表单并将错误添加到模板上下文中,以便为用户呈现它们。
只是旁注:
替代
form_invalid
您只需将self.fields['title'].validators.append(validate_tasty)
方法直接添加到名为validate_tasty
和FlavorForm
的{{1}}即可。这是添加自定义验证逻辑的Django标准方法。
clean_title