【问题标题】:Django Model Form validation doesn't showDjango 模型表单验证不显示
【发布时间】:2018-11-30 21:53:30
【问题描述】:

我需要对 Django ModelForm 字段进行一些验证。所以我在我的 models.py 中更改了 2 行(就在下面)。验证在必要时被阻止,但我找不到显示 ValidationError 的正确方法。也许在模型表单中有更简洁的方法来做到这一点?

models.py

class Lexicon(models.Model):

    [...]

    alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', _('Only alphanumeric characters are allowed'))
    filename = models.CharField(_("Filename"), max_length=40, validators=[alphanumeric])

forms.py

class LexiconForm(forms.ModelForm):
    class Meta:
        model = Lexicon
        fields = ['filename', 'language', 'comment', 'alphabet', 'case_sensitive', 'diacritics']

views.py

@login_required
def new_pls_view(request):
    if request.method == 'POST':
        form = LexiconForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.user = request.user
            obj.save()
            return redirect('pls_edit')
    else:
        form = LexiconForm()
    return render(request, 'main/new_pls.html', {
        'form': form,
    })

template.html

<form class="form-horizontal" method="post" action="{% url 'new_pls' %}">
    {% csrf_token %}

{% if form.non_field_errors %}
    <div class="alert alert-danger" role="alert">
        {% for error in form.non_field_errors %}
            {{ error }}
        {% endfor %}
    </div>
{% endif %}

[...]

{% if form.is_bound %}
    {% if form.filename.errors %}
        {% for error in form.filename.errors %}
            <div class="invalid-feedback">
                {{ error }}
            </div>
        {% endfor %}
    {% endif %}

    {% if form.filename.help_text %}
        <small class="form-text text-muted">{{ form.filename.help_text }}</small>
    {% endif %}
{% endif %}

{% render_field form.filename type="text" class+="form-control" id="plsFilename" placeholder=form.filename.label %}

按照@Alasdair 的建议将我的整个表单替换为{{ form }} 是可行的,所以我猜我的模板渲染有问题。

【问题讨论】:

  • 如果您使用{{ form }} 显示表单而不是手动呈现字段,您会看到错误吗?请显示LexiconForm。请检查您的视图的缩进是否与您的代码完全匹配,尤其是else 块。
  • 不,它不显示,即使使用{{ form }}。编辑了我对 LexiconForm 的问题。还按照您的建议更正了我帖子中的缩进。
  • 你在表单中输入了什么来测试它,你怎么知道验证器正在工作(例如你在视图中打印form.errors)?
  • 尝试了不同的东西,如 test*、test test、test-test,我认为验证器正在工作,因为我停留在同一页面上,而不是在成功的情况下被重定向。 form._errors 包含“{ErrorDict}
    • 文件名
      • 只允许使用字母数字字符
    "
  • 我已经删除了我之前的评论,它没有意义。如果{{ form }} 显示错误,那么form.filename.errors 也应该显示错误。您的模板比它需要的更复杂(例如,不必要的form.is_bound 检查),但我看不到任何解释为什么不显示错误的内容。

标签: python django django-models django-forms django-validation


【解决方案1】:

我只是用这个替换了我的错误打印并且错误打印了!

<form class="form-horizontal" method="post" action="{% url 'new_pls' %}">
    {% csrf_token %}

    {{ form.non_field_errors }}

    [...]

    {{ form.filename.errors }}
    {% render_field form.filename type="text" class+="form-control" id="plsFilename" placeholder=form.filename.label %}

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2017-06-14
    • 2012-05-02
    • 2013-06-15
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多