Python Django表单打印无错误且无效
为了在我的网站中创建表单,我创建了一些与我的字段对应的模型。然后,我从中创建了模型表单、一些视图和模板。我的问题是,我从来没有首先看到我的表单错误,其次,这个特定字段总是有他的表单无效,即使其中有一个属性。你能解释一下我做错了什么吗 型号.pyPython Django表单打印无错误且无效,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,为了在我的网站中创建表单,我创建了一些与我的字段对应的模型。然后,我从中创建了模型表单、一些视图和模板。我的问题是,我从来没有首先看到我的表单错误,其次,这个特定字段总是有他的表单无效,即使其中有一个属性。你能解释一下我做错了什么吗 型号.py class Grapheme(models.Model): lexeme = models.ForeignKey(Lexeme, on_delete=models.CASCADE) value = models.CharField(ma
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
class GraphemeForm(forms.ModelForm):
class Meta:
model = Grapheme
fields = ['value']
@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
[...]
forms.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
class GraphemeForm(forms.ModelForm):
class Meta:
model = Grapheme
fields = ['value']
@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
[...]
视图.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
class GraphemeForm(forms.ModelForm):
class Meta:
model = Grapheme
fields = ['value']
@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>
{%if grapheme\u form.non\u field\u errors%}
{grapheme_form.non_field_errors%}
{{error}}
{%endfor%}
{%endif%}
[...]
{{grapheme_form.value.label}
{%如果grapheme_form.is_bound%}
{%if grapheme_form.value.errors%}
{grapheme_form.value.errors%中的错误为%s}
{{error}}
{%endfor%}
{%endif%}
{%if grapheme\u form.value.help\u text%}
{{grapheme\u form.value.help\u text}
{%endif%}
{%endif%}
{%render\u field grapheme\u form.value type=“text”class+=“form control”id=“graphemeInput”%}
问题在于Grapheme型号上的lexeme外键
由于您使用的是django Modelforms,如果未将外键关系设置为blank=True
,null=True
,它将自动成为必填字段
在表单中,您声明不希望显示lexeme外键选择,因此它不会出现在表单中:
fields = ['value']
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']
这就是为什么在表单上出现必填字段丢失错误的原因
您有两种可能的解决方案:解决方案1
将blank=True、null=True添加到外键关系:
lexeme = models.ForeignKey(Lexeme, blank=True,null=True on_delete=models.CASCADE)
解决方案2: 初始化表单时设置词素值:
fields = ['value']
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\u formNo时能否显示输出?我没有上载任何内容。这里是Grapheme的_errors值:
- 此字段是必需的。