Python Django CreateView与form_类不创建模型
我从两勺Django书中练习,我在CreateView中遇到了form_类的问题。如果我只在CreateView中使用字段,它将保存模型,如果我使用form_类,它也不会保存和重定向 我使用form_类来练习验证器 views.pyPython Django CreateView与form_类不创建模型,python,django,Python,Django,我从两勺Django书中练习,我在CreateView中遇到了form_类的问题。如果我只在CreateView中使用字段,它将保存模型,如果我使用form_类,它也不会保存和重定向 我使用form_类来练习验证器 views.py class FlavorCreateView(LoginRequiredMixin, CreateView): model = Flavor success_url = '/flavors/list/' template_name = 'fl
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']
验证器.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 %}
{%extends'base\u flavor.html%}
{%block content%}
{%csrf_令牌%}
{{form.title.errors.as_text}
{%形式的字段为%}
{{field.label}}:{{field}
{%endfor%}
萨尔瓦多
{%endblock%}
您的代码可能正按预期工作(看起来是这样的):
“不保存也不重定向”:=出现验证错误时会发生这种情况
重写表单\u invalid
,并打印一些日志输出。或者只是在模板中输出表单错误
Django中出现验证错误时会发生的情况是重新加载表单,并将错误添加到模板上下文中,以便为用户呈现这些错误
只是一个旁注: 替代
self.fields['title'].validators.append(validate_tasty)
您只需将validate\u tasty
方法直接添加到您的FlavorForm
名称下的clean\u title
和clean\u 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']
您的代码可能正按预期工作(看起来是这样的): “不保存也不重定向”:=出现验证错误时会发生这种情况 重写
表单\u invalid
,并打印一些日志输出。或者只是在模板中输出表单错误
Django中出现验证错误时会发生的情况是重新加载表单,并将错误添加到模板上下文中,以便为用户呈现这些错误
只是一个旁注: 替代
self.fields['title'].validators.append(validate_tasty)
您只需将validate\u tasty
方法直接添加到您的FlavorForm
名称下的clean\u title
和clean\u 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']
您的视图中可能缺少一个save()。您的视图中可能缺少一个save()。啊,现在我知道了,在slug字段中,我写的Tasty是这样的“Tasty”,这就是为什么它没有渲染。您能写一个clean_title的示例吗?啊,现在我知道了,在slug字段中,我写的是Tasty,就像这个“Tasty”,这就是为什么它没有渲染。你能写一个clean_标题的例子吗?