有没有办法阻止验证提交的Django ModelForm?
原因是我在该表单中有两个选择字段,并且我使用Ajax更改了相关表。 因此我需要重新加载表单才能选择新的/更改的值,并且我不想要所有的验证错误。
编辑:
我最初的计划是设置隐藏字段"刷新"并提交表单(Ajax)。 在create_component中,我想检查refresh的值,并返回已呈现但未经验证的表单,并使用jQuery替换它。 我希望form.is_valid()能够触发验证过程,但不幸的是,如果我在不调用is_valid的情况下渲染表单,我会得到一个经过验证的表单。
views.py
def create_component(request):
if request.method == "POST":
form = ComponentForm(request.POST)
if request.POST.get('refresh',False):
return render(request, "component_form.html", {"form":form})
if form.is_valid():
form.save()
return redirect("material")
else:
form = ComponentForm()
return render(request, "create_component.html", {"form":form})
forms.py
class ComponentForm(ModelForm):
refresh = BooleanField(widget=HiddenInput, required=False)
class Meta:
model = Component
fields = ['name', 'articlenumber', 'manufacturer', 'vendor', 'price', 'picture', 'notes']
labels = {
'name': _('Bezeichnung'),
'manufacturer': _('Hersteller'),
'articlenumber': _('Artikelnummer'),
'vendor': _('Lieferant'),
'price': _('Preis'),
'notes': _('Notizen')
}
widgets = {
'picture': HiddenInput
}
答案 0 :(得分:0)
您可以使用Django错误消息:https://docs.djangoproject.com/en/1.9/ref/contrib/messages/#adding-a-message
将AJAX帖子发送到当前网址视图。然后,您可以使用AJAX在表单内的div或p中请求和显示表单错误。无需刷新。 以下是使用AJAX,Django 1.9和Python 2.7插入注释的示例:
forms.py:
#comment form
class InsertComentForm(forms.Form):
comment = forms.CharField(widget=forms.Textarea(attrs={'id': 'comment', 'placeholder': 'Enter a Comment'}),required = True)
views.py:
#inside comment view
InsertComent = forms.InsertComentForm()
if request.is_ajax():
if request.method == 'POST':
InsertComent = forms.InsertComentForm(request.POST)
if request.POST.get("InsertCommentSubmit") is not None: #error
if request.POST.get("comment")=="":
message = "Comment field cannot be empty!"
return HttpResponse(message)
elif User.objects.filter(username = request.user.username).exists():
if InsertComent.is_valid():
article_id = Article.objects.get(title=Slug, pub_date= aTimestamp).pk
article_id = article_id
user_id = request.user.id
p=Comment(comment=InsertComent.cleaned_data['comment'], article_id=article_id, user_id=user_id, date=date.today(), flagged=0, ipAddress=get_ip(request))
p.save()
message="Thanks for commenting!"
return HttpResponse(message)
else:
messages.error(request, "Login to Comment!");
else:
message = "Not Ajax"
return HttpResponse(message)
模板:
<form id="commentForm" class="col-md-12 djangoForm" action="" method="POST">
<p class="formMessage" id="error_msg_comment"> </p><!-- Needs Space for style, AJAX Errors Here-->
<div class="fieldWrapper">
<input type="hidden" name="csrfmiddlewaretoken" id="csrfmiddlewaretoken" value="{{ csrf_token }}">
</div>
<div class="fieldWrapper">
{{ InsertComentForm.comment }}
</div>
<input id="InsertCommentSubmit" name="InsertCommentSubmit" class="Button" type="submit" class="btn btn-default" value="Send" onclick="return InsertCommentForm()"/>
</form>
AJAX:
//Do not forget to pass the csrfmiddlewaretoken!
function InsertCommentForm(){
var comment=document.getElementById('comment').value; //change from name to id!
var csrfmiddlewaretoken=document.getElementById('csrfmiddlewaretoken').value; //change from name to id!
var InsertCommentSubmit=document.getElementById('InsertCommentSubmit').value;//change from name to id!
var dataString = 'comment='+ comment+
'&csrfmiddlewaretoken='+ csrfmiddlewaretoken +
'&InsertCommentSubmit='+ InsertCommentSubmit;
$.ajax({
type: "post",
url : "",
data:dataString,
cache:false,
success: function(html){
if (html==0){
window.location.reload();
//document.getElementById("commentForm").reset();
}else{
$('#error_msg_comment').html(html);
}
}
});
return false;
}
我希望你可以建立或使用这个例子!
答案 1 :(得分:0)
我终于找到了符合我需求的解决方案。 我使用Ajax调用提交表单,从响应中取出更新的select并用原来的select替换:
$("#id_refresh").val(1);
$.post(
$("form").attr("action"),
$("form").serialize(),
function(d) {
$("#id_manufacturer").replaceWith($(d).find("#id_manufacturer"));
$("#id_refresh").val(0);
}
);
这可能是一种hacky方式,但它适用于我。
答案 2 :(得分:0)
如果我在不调用is_valid
的情况下呈现表单,我会得到一个经过验证的表单
......这对我来说听起来不对。
我认为你的实际问题在这里:
Modules textReplacement = Modules(
Replace(" -- ", "—"),
Replace("--", "—"),
Trace("Text replacement performed...")
);
Pipelines.Add("Pages",
ReadFiles("*.md"),
textReplacement,
WriteFiles("*.html)
);
...当检查这样的原始post var(由表单未处理)时,该值将始终为字符串,因此它将始终比较为if request.POST.get('refresh',False):
(具体来说,如果您在True
中检查BooleanField
的src,则会有一条评论说明&#34;请检查字符串&#39; False&#39;,这是隐藏字段将为False&#34; )提交的内容
因此,您获得经过验证的表单的原因是您的代码遵循django/forms/fields.py
代码路径。
您可能会发现从表单类中删除form.is_valid
字段会更容易(我假设只是为了您的hack目的而需要),而是手动将refresh
查询字符串附加到您的POST网址中JavaScript的。在您的视图中,这将更容易解析:
?refresh=1