【问题标题】:Django form prints no error and is not validDjango 表单不打印错误且无效
【发布时间】:2025-12-03 20:35:02
【问题描述】:

为了在我的网站中创建表单,我创建了一些与我的字段对应的模型。然后我从它们、一些视图和模板中创建了 ModelForms。我的问题是我从来没有首先看到我的表单错误,其次,这个特定字段的表单总是无效,即使其中有一个属性。你能解释一下我做错了什么吗?

models.py

class Grapheme(models.Model):
    lexeme = models.ForeignKey(Lexeme, on_delete=models.CASCADE)

    value = models.CharField(max_length=256)

    class Meta:
        verbose_name = "grapheme"
        ordering = ["value"]

    def __str__(self):
        return self.value

forms.py

class GraphemeForm(forms.ModelForm):
    class Meta:
        model = Grapheme
        fields = ['value']

views.py

@login_required
def lexeme_edit_view(request, lexicon_id):
    [...]

    if request.method == 'POST':
        lexeme_form = LexemeForm(request.POST)
        grapheme_form = GraphemeForm(request.POST)
        [...]

        if grapheme_form.is_valid(): # This line fails
        [...]

template.html

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

[...]

<div class="form-group row">
    <label for="graphemeInput" class="control-label col-lg-2">{{ grapheme_form.value.label }}</label>
    <div class="col-lg-6">
        {% if grapheme_form.is_bound %}
            {% if grapheme_form.value.errors %}
                {% for error in grapheme_form.value.errors %}
                    <div class="invalid-feedback">
                        {{ error }}
                    </div>
                {% endfor %}
            {% endif %}

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

        {% render_field grapheme_form.value type="text" class+="form-control" id="graphemeInput" %}
    </div>
</div>

【问题讨论】:

  • 请显示视图的其余部分。您是否将绑定的表单传回模板?
  • 当你打印grapheme_form时你能告诉我们输出吗

标签: python django django-forms django-views


【解决方案1】:

问题是您的 Grapheme 模型上的词位外键。

由于您使用的是 django Modelforms,如果您没有将 blank=Truenull=True 设置为外键关系,它会自动成为必填字段。

在您的表单中,您声明您不想显示词位外键选择,因此它不会出现在您的表单上:

fields = ['value']

这就是您在表单上收到必填字段缺失错误的原因。

您有两种可能的解决方案:
解决方案 1
将blank=True, null=True 添加到您的外键关系中:

lexeme = models.ForeignKey(Lexeme, blank=True,null=True on_delete=models.CASCADE)


解决方案 2: 在初始化表单时设置词位值:

class GraphemeForm(Form):
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    lexeme = Lexeme.objects.get(id=1)
    self.fields['lexeme'].initial = lexeme

class Meta:
    model = Grapheme
    fields = ['value']

【讨论】:

  • 不,我没有上传任何内容。这是 Grapheme 的 _errors 值:
    • 此字段是必需的。
  • 好的,我发现您声明词法外键的方式以及在视图中呈现表单的方式存在问题。我刚刚更新了我的答案
  • 简单地说,我认为表单可能是有效的,因为我只为它分配了 value 而不是 ForeignKey,但我现在明白了,谢谢!
  • 我也遇到了几个名为“值”的表单字段的问题,导致了一个数组,但这不是我最初的预期。