如何防止验证Django ModelForm

时间:2016-01-29 12:59:03

标签: jquery django validation modelform

有没有办法阻止验证提交的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
    }

3 个答案:

答案 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(" -- ", "&mdash;"),
    Replace("--", "&mdash;"),
    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