无法使用单个字段验证表单,并使用ajax帖子

时间:2017-07-04 13:06:08

标签: ajax django

我一直无法通过搜索找到问题的解决方案。所以我想问一下我的代码可能有什么问题。我尝试从forms.ModelForm验证表单,但在我的视图函数中,它无法通过form.is_valid()。打印form.errors给了我:

<li>title<ul class="errorlist"><li>This field is required.</li></ul> 

型号:

class Paper(models.Model):
    title = models.CharField(max_length=100, help_text='Hello World!')

forms.FormModel

class eventCreateForm(forms.ModelForm):

    class Meta:
        Model = Paper
        fields = ['title']

        widgets = {            
            'title': forms.TextInput(attrs={'class' :'form-control', 'placeholder' : 'Place title'}),          
        }

浏览

def create_paper(request):

    context = {}             

    if request.method == 'POST':
        form = paperCreateForm(request.POST or None, request.FILES or None)   

        if form.is_valid():             

            form_data = form.cleaned_data                
            t1 = form_data['title']      
            print(t1)

        else:

            context['create_paper_form'] = form

    form_template = "user/paper-event-template.html"

    return HttpResponse(render_to_string(form_template, {'context' : context}))    

表单已经过验证,而在else子句中,当尝试从cleaned_data

中检索时,它会传递错误

我确实尝试打印表单,它显示:

<tr><th><label for="id_title">Title:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input class="form-control" id="id_title" maxlength="100" name="title" placeholder="Place Title" type="text" required /></td></tr>

但它不包含任何值,我想它应该:我使用jax方法发送表单数据:

AJAX

$('#create_paper_form_id').submit(function (event) {
        event.preventDefault();

        $.ajax({
            type: "POST",
            url: "{% url 'Eapp:create_paper' %}",
            data: { 
                csrfmiddlewaretoken : '{{ csrf_token }}',
                form_data : $('#create_paper_form_id').serializeArray(),

                },
            success: function (data) {
                console.log(data);
                $('.create-paper').html(data);
            },
            error: function() {
                console.log('err');
            }
        });
  });   

HTML

<div class="create-paper">
    <div class="container-fluid">
        <form class="form" id="create_paper_form_id" novalidate="novalidate" action="{% url 'Eapp:create_event' %}" method="POST">          
            {% for field in create_paper_form %}
            <div class="form-group">
                <div class="col-xs-12">
                    {{ field.label_tag }}   
                </div>  
                <div class="col-xs-12">
                    {{ field }} 
                </div>
                <div class="col-xs-6">
                    {{ field.help_text }}   
                </div>              
                <div class="col-xs-6">
                    {{ field.errors }}  
                </div>  
            </div>
            {% endfor %}    
            <div class="form-group">
                <div class="col-xs-6  col-sm-6 col-md-2 col-lg-2">
                    <button type="submit" class="btn btn-primary">Submit</button>
                </div>
            </div>
        </form>
    </div>
</div>

1 个答案:

答案 0 :(得分:3)

这是预期的行为,cleaned_data只有在有效的表单上才有实际清理过的数据。

form.data仍可用,您可以使用它。

引用manual

  

Form实例有一个is_valid()方法,它运行验证   所有领域的惯例。调用此方法时,如果是所有字段   包含有效数据,它将:

     
      
  • return True
  •   
  • 将表单的数据放入其cleaning_data属性中。
  •   

[edit]正如@ fazil-zaid所提到的,您需要在model课程中加入Meta才能使其成为modelform