【问题标题】:Django CreateView with form_class not creating model带有form_class的Django CreateView没有创建模型
【发布时间】:2017-08-29 12:12:06
【问题描述】:

我正在练习两勺 Django 书籍,但我在 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']

验证器.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 %}

【问题讨论】:

  • 您的视图中可能缺少 save()。

标签: python django


【解决方案1】:

您的代码可能只是按预期工作(看起来是这样):

“它没有保存也没有重定向” := 当出现验证错误时会发生这种情况。

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

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


只是一个旁注:

作为替代

self.fields['title'].validators.append(validate_tasty)

您可以简单地将validate_tasty 方法直接添加到您的FlavorForm 名称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']

【讨论】:

  • aah 现在我明白了,在蛞蝓领域我正在写 Tasty 这样的“美味”,这就是它没有渲染的原因。
  • 你能写一个clean_title的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2011-09-07
  • 2013-04-12
  • 2014-08-09
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多