Django提交按钮不适用于Ajax请求

2024-04-23 18:58:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个网站,用户可以创建帖子并对其发表评论,但是,在点击post_detail.html模板中的提交按钮提交评论后,什么都没有发生,我甚至看不到错误。我正在使用jQuery提交表单

这是我的post_详细视图:

@login_required
def post_detail(request, id):
    data = dict()
    post = get_object_or_404(Post, id=id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(False)
            comment.post = post
            comment.name = request.user
            comment.save()
            comments = post.comments.all()
            data['form_is_valid'] = True
            data['comments'] = render_to_string('home/posts/post_detail.html', { 'comments':comments }, request=request)
        else:
            data['form_is_valid'] = False
    else: 
        form = CommentForm
        comments = post.comments.all()
    context  = {
        'form': form,
        'comments': comments,
        'post': post
    }
    data['html_data'] = render_to_string('home/posts/post_detail.html', context,request=request)
    return JsonResponse(data)

这是我的post_detail.html模板:

       {% load crispy_forms_tags %}
        {% load static %}
        <script src="{% static 'js/comment.js' %}"></script>
        <div class="modal-header-sm">
          <button type="button" class="close mx-2" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="card  mt-3 rounded-0 mb-3" style="max-width: 100rem !important;">
            <div class="card-body text-dark">
              <div class="d-flex">
                <img class="img-create-post rounded-circle mr-2" style="width: 50px;height: 50px;" src="https://mdbootstrap.com/img/Photos/Avatars/avatar-5.jpg"
                  alt="Profile image">
                  <span class="align-text-top"><a class="mr-2 text-dark font-weight-bolder" href="#">{{ post.author.first_name }} {{ post.author.last_name }} </a><br><p class="font-weight-light text-muted">{{ post.title }}</p></span>
                    <div class="float-right text-right ml-auto">
                      <p class="text-muted small" style="font-size: 0.7rem;">{{ post.date_posted|date:"F d, Y" }}</p>
                    </div>     
              </div>
              <p class="card-text">{{ post.content }}</p>
            </div>
            <div class="card-footer" style="height: 5rem;">
              <a class="mx-1 small" data-href='{{ post.get_api_like_url }}' data-likes='{{ post.likes.count }}' href='{{ post.get_like_url }}'><i class="fas fa-thumbs-up"></i> Like</a>
              <hr class="my-1">
                <p class="text-muted small">
                  {% if post.author == request.user %}  
                  <button class="btn btn-sm text-muted show-form-delete ml-auto" data-url="{% url 'home:post-delete' post.id %}" style="font-size: small;" style="height: 0rem;">Remove</button> 
                  {% endif %}
                  <small class="float-sm-right">
                    {{ post.likes.count }} Likes, {{ post.comments.count }} Comments
                  </small>
                </p>
            </div>
            <div class="card-body">
              <div class="row">
                  <img class="img-create-post rounded-circle mr-2" style="width: 40px;height: 40px;" src="{{ request.user.image }}" alt="Profile image">


<form method="POST" data-url="{% url 'home:post-detail' post.id %}" class="post-comment-form">
        {% csrf_token %}
          <div class="row ml-1">
          {{ form | crispy }}
          <button class="btn btn-sm ml-1 small btn-rounded btn-primary" style="height: 2.3rem;" type="submit">Add</button> 
        </div>  
      </form> 
              </div>
              <hr>
          </div>
          <div id="post-linked-comments">
            <div>
              {% include 'home/posts/post_comment.html' %}
            </div>    
          </div>
          </div>

post_comment.html模板供您参考,但很可能不是问题:

<ul class="list-group list-group-flush">
    {% for comment in comments %}
    <li class="list-group-item">
        <div class="d-flex">
            <img class="img-create-post rounded-circle mr-1" style="width: 20px;height: 20px;" src="{{ comment.name.image }}"
              alt="Profile image">
              <span class="align-text-top font-weight-bolder">{{ comment.name.first_name }}
                <p class="text-muted small mx-2" style="font-size: 0.7rem;">{{ comment.created_on|date:"F d, Y at: f A" }}</p><br>
                <p class="font-weight-light">{{ comment.body }}</p></span> 
          </div>
    </li>
    {% empty %}
    <li class="list-group-item">
      <div class="d-flex">
              <p class="font-weight-lighter text-muted">No comments to show</p>
        </div>
    </li>
    {% endfor %}
</ul>

最后是我在comment.js中的javascript代码:

$(document).ready(function(){
    var ShowForm = function(e){
        e.stopImmediatePropagation();
        var btn = $(this);
        $.ajax({
            url: btn.attr("data-url"),
            type: 'get',
            dataType:'json',
            beforeSend: function(){
                $('#modal-post-detail').modal('show');
            },
            success: function(data){
                $('#modal-post-detail .modal-content').html(data.html_data);
            }
        });
    };

    var SaveForm =  function(e){
        e.stopImmediatePropagation();
        var form = $(this);
        $.ajax({
            url: form.attr('data-url'),
            data: form.serialize(),
            type: form.attr('method'),
            dataType: 'json',
            success: function(data){
                if(data.form_is_valid){
                    $('#post-linked-comments div').html(data.comments);
                    alert('Comment added')
                } else {
                    $('#modal-post-detail .modal-content').html(data.html_data)
                }
            }
        })
        return false;
    }

//adding a comment
$('.comment-post-btn').click(ShowForm);
$('.post-detail-clickable-details-view').click(ShowForm);
$('#modal-post-detail').on("submit",".post-comment-form",SaveForm)

});

获取Javascript文件没有问题,因为post_detail模式弹出得很好,但是在单击add按钮后,什么也没有发生

提前谢谢你的帮助

编辑:按钮应添加到表单中,但现在在单击“添加”按钮后,将引发NoReverseMatchException:

新表格:

<form method="POST" data-url="{% url 'home:post-detail' post.id %}" class="post-comment-form">
        {% csrf_token %}
          <div class="row ml-1">
          {{ form | crispy }}
          <button class="btn btn-sm ml-1 small btn-rounded btn-primary" style="height: 2.3rem;" type="submit">Add</button> 
        </div>  
      </form>

URL.py:

path('post/<int:id>/', views.post_detail, name='post-detail'),

错误:

django.urls.exceptions.NoReverseMatch: Reverse for 'post-detail' with arguments '('',)' not found. 1 pattern(s) tried: ['home/post/(?P<id>[0-9]+)/$']

解决:我自己设法解决了这个问题。这是我的看法。我将评论发送到错误的html模板。下面可以看到模板的更正视图

@login_required
def post_detail(request, id):
    data = dict()
    post = get_object_or_404(Post, id=id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(False)
            comment.post = post
            comment.name = request.user
            comment.save()
            comments = post.comments.all()
            data['form_is_valid'] = True
            #data['comments'] = render_to_string('home/posts/post_detail.html', { 'comments':comments }, request=request)
            #corrected code below
            data['comments'] = render_to_string('home/posts/post_comment.html', { 'comments':comments }, request=request)       else:
            data['form_is_valid'] = False
    else: 
        form = CommentForm
        comments = post.comments.all()
    context  = {
        'form': form,
        'comments': comments,
        'post': post
    }
    data['html_data'] = render_to_string('home/posts/post_detail.html', context,request=request)
    return JsonResponse(data)

Tags: textdivformidurldatastylerequest
1条回答
网友
1楼 · 发布于 2024-04-23 18:58:21

我相信没有发生任何事情,因为提交按钮没有在任何表单标签中定义

post_detail.html中的代码来看button标记位于form标记之外


  <div class="row">
      <img class="img-create-post rounded-circle mr-2" style="width: 40px;height: 40px;" src="{{ request.user.image }}" alt="Profile image">
      <form method="POST" data-url="{% url 'home:post-detail' post.id %}" class="post-comment-form">
        {% csrf_token %}
        <div class="moda-body">
          {{ form | crispy }}
        </div>
      </form>
      <button class="btn btn-sm ml-1 small btn-rounded btn-primary" style="height: 2.3rem;" type="submit">Add</button> 
  </div>

按钮标签应放在表单的结束标签之前


  <div class="row">
      <img class="img-create-post rounded-circle mr-2" style="width: 40px;height: 40px;" src="{{ request.user.image }}" alt="Profile image">
      <form method="POST" data-url="{% url 'home:post-detail' post.id %}" class="post-comment-form">
        {% csrf_token %}
        <div class="moda-body">
          {{ form | crispy }}
        </div>
        <button class="btn btn-sm ml-1 small btn-rounded btn-primary" style="height: 2.3rem;" type="submit">Add</button> 
      </form>
  </div>

相关问题 更多 >