Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django CreateView与form_类不创建模型_Python_Django - Fatal编程技术网

Python Django CreateView与form_类不创建模型

Python 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

我从两勺Django书中练习,我在CreateView中遇到了form_类的问题。如果我只在CreateView中使用字段,它将保存模型,如果我使用form_类,它也不会保存和重定向

我使用form_类来练习验证器

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']
验证器.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_标题的例子吗?