django jquery 评论表单发布太多次

发布于 2024-10-04 12:34:23 字数 4565 浏览 2 评论 0原文

我已经修改了我的 comments/form.htmlcomments/posted.html 以与 facebook 类似的方式工作,即您发布评论 ,然后重新加载posted数据并将其附加到具有给定ID的特定div

我遇到的问题是它似乎发布了表格数量的所有数据。

所以场景是,我有 5 个表单,其中一个包含数据,如果我点击评论,它会提交数据,1 个成功,但 4 个返回空。

<div id="commentload"></div>
<div class="comments">
    <form action="{% comment_form_target %}" method="post" class="comment-form">
    {% if next %}<input type="hidden" name="next" value="{{ next }}" />{% endif %}
    {% for field in form %}
        {% if field.is_hidden %}
            {{ field }}
        {% else %}
        {% if field.errors %}{{ field.errors }}{% endif %}
            <p
            {% if field.errors %} class="error"{% endif %}
            {% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}>
            </p>
        {% endif %}
    {% endfor %}
    <textarea id="id_comment" rows="1" cols="60" name="comment" class='id_comment'></textarea>
    <p class="submit">
        <input type="submit" name="post" class="submit-post blue comment_submit" value="{% trans "Comment" %}" id="button" style="float:right;margin-top:-6px;margin-bottom:4px;"/>
    </p>
    <div class="clearfix"></div>
    </form>

</div>

然后我的 jQuery 如下所示

<script type="text/javascript">
    $(document).ready(function(){
        // Here it runs a simple each statement to apply a unique ID to each comment-form
        $('.comment-form').each(function(){
            var element = $(this).find('#id_object_pk').val();
            $('#commentload').attr('id','commentload'+element);
            $(this).attr('name', element);
            $(this).attr('id', element);
            $(this).find('#button').attr('id', element);
            $(this).find('#id_content_type').attr('id', 'id_content_type' + element);
            $(this).find('#id_timestamp').attr('id', 'id_timestamp' + element);
            $(this).find('#id_security_hash').attr('id', 'id_security_hash' + element);
            $(this).find('#id_comment').attr('id', 'id_comment' + element); 
        });

        $(".comment_submit").live("click",function() {
            var ID = $(this).attr('id');

            var content_type = $('#id_content_type'+ID).val();
            var timestamp = $('#id_timestamp'+ID).val();
            var security_hash = $('#id_security_hash'+ID).val();
            var comment = $('#id_comment'+ID).val();
            var dataString = 'content_type='+ content_type +'&timestamp='+ timestamp +'&security_hash=' + security_hash + '&comment=' + comment + '&object_pk=' + ID;

            if (comment=='') {
                alert('Please enter a comment');
            } else {
                $('#id_comment'+ID).val('').addClass("greyout");
                $.ajax({
                    type: "POST",
                    url: "{% comment_form_target %}",
                    data: dataString,
                    cache: false,
                    success: function(html){
                        $("#commentload"+ID).append(html);
                        $('#id_comment'+ID).val('').removeClass("greyout").focus();
                    }
                });
            }
            return false;
        });
    });
</script>

HTML 输出表单之间的差异显然是每个表单的 ID

<div id="wall-comments">
    <div class="comments">
    <form action="/comments/post/" method="post" class="comment-form" id="114">
        <input type="hidden" name="content_type" value="wall.post" id="id_content_type114">
        <input type="hidden" name="object_pk" value="114" id="id_object_pk">
        <input type="hidden" name="timestamp" value="1291370494" id="id_timestamp114">
        <input type="hidden" name="security_hash" value="2d208d05d725528dfef940d8a5b520362faa3317" id="id_security_hash114">
        <textarea id="id_comment114" rows="1" cols="60" name="comment" class="id_comment" style="height: 24px; overflow-x: hidden; overflow-y: hidden; "></textarea>
        <p class="submit">
            <input type="submit" name="post" class="submit-post blue comment_submit" value="Comment" id="114" style="float:right;margin-top:-6px;margin-bottom:4px;">
        </p>
        <div class="clearfix"></div>
    </form>
    </div>
</div>

I have modified my comments/form.html and comments/posted.html to work in a similar way to facebook, ie you post a comment, the data posted is then reloaded and appended to a certain div with a given ID.

The problem I have is that it seems to post all the data for the amount of forms.

So the scenario is, I have 5 forms, one with data in it, if I then hit comment, it submits the data, 1 successful but 4 return empty.

<div id="commentload"></div>
<div class="comments">
    <form action="{% comment_form_target %}" method="post" class="comment-form">
    {% if next %}<input type="hidden" name="next" value="{{ next }}" />{% endif %}
    {% for field in form %}
        {% if field.is_hidden %}
            {{ field }}
        {% else %}
        {% if field.errors %}{{ field.errors }}{% endif %}
            <p
            {% if field.errors %} class="error"{% endif %}
            {% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}>
            </p>
        {% endif %}
    {% endfor %}
    <textarea id="id_comment" rows="1" cols="60" name="comment" class='id_comment'></textarea>
    <p class="submit">
        <input type="submit" name="post" class="submit-post blue comment_submit" value="{% trans "Comment" %}" id="button" style="float:right;margin-top:-6px;margin-bottom:4px;"/>
    </p>
    <div class="clearfix"></div>
    </form>

</div>

And then my jQuery looks as follows

<script type="text/javascript">
    $(document).ready(function(){
        // Here it runs a simple each statement to apply a unique ID to each comment-form
        $('.comment-form').each(function(){
            var element = $(this).find('#id_object_pk').val();
            $('#commentload').attr('id','commentload'+element);
            $(this).attr('name', element);
            $(this).attr('id', element);
            $(this).find('#button').attr('id', element);
            $(this).find('#id_content_type').attr('id', 'id_content_type' + element);
            $(this).find('#id_timestamp').attr('id', 'id_timestamp' + element);
            $(this).find('#id_security_hash').attr('id', 'id_security_hash' + element);
            $(this).find('#id_comment').attr('id', 'id_comment' + element); 
        });

        $(".comment_submit").live("click",function() {
            var ID = $(this).attr('id');

            var content_type = $('#id_content_type'+ID).val();
            var timestamp = $('#id_timestamp'+ID).val();
            var security_hash = $('#id_security_hash'+ID).val();
            var comment = $('#id_comment'+ID).val();
            var dataString = 'content_type='+ content_type +'×tamp='+ timestamp +'&security_hash=' + security_hash + '&comment=' + comment + '&object_pk=' + ID;

            if (comment=='') {
                alert('Please enter a comment');
            } else {
                $('#id_comment'+ID).val('').addClass("greyout");
                $.ajax({
                    type: "POST",
                    url: "{% comment_form_target %}",
                    data: dataString,
                    cache: false,
                    success: function(html){
                        $("#commentload"+ID).append(html);
                        $('#id_comment'+ID).val('').removeClass("greyout").focus();
                    }
                });
            }
            return false;
        });
    });
</script>

HTML OUTPUT the difference between the forms obviously the ID for each one

<div id="wall-comments">
    <div class="comments">
    <form action="/comments/post/" method="post" class="comment-form" id="114">
        <input type="hidden" name="content_type" value="wall.post" id="id_content_type114">
        <input type="hidden" name="object_pk" value="114" id="id_object_pk">
        <input type="hidden" name="timestamp" value="1291370494" id="id_timestamp114">
        <input type="hidden" name="security_hash" value="2d208d05d725528dfef940d8a5b520362faa3317" id="id_security_hash114">
        <textarea id="id_comment114" rows="1" cols="60" name="comment" class="id_comment" style="height: 24px; overflow-x: hidden; overflow-y: hidden; "></textarea>
        <p class="submit">
            <input type="submit" name="post" class="submit-post blue comment_submit" value="Comment" id="114" style="float:right;margin-top:-6px;margin-bottom:4px;">
        </p>
        <div class="clearfix"></div>
    </form>
    </div>
</div>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凉月流沐 2024-10-11 12:34:23

您绑定点击功能的次数过多。您只应该调用 .live("click", function() {});每页加载一次。否则,您应该在再次调用 live() 之前使用 die() 取消绑定函数。

我仍然认为这就是答案。将 click .live 调用更改为:

$(".comment_submit").die("click").live("click",function() {
    var ID = $(this).attr('id');

    var content_type = $('#id_content_type'+ID).val();
    var timestamp = $('#id_timestamp'+ID).val();
    var security_hash = $('#id_security_hash'+ID).val();
    var comment = $('#id_comment'+ID).val();
    var dataString = 'content_type='+ content_type +'×tamp='+ timestamp +'&security_hash=' + security_hash + '&comment=' + comment + '&object_pk=' + ID;

    if (comment=='') {
        alert('Please enter a comment');
    } else {
        $('#id_comment'+ID).val('').addClass("greyout");
        $.ajax({
            type: "POST",
            url: "{% comment_form_target %}",
            data: dataString,
            cache: false,
            success: function(html){
                $("#commentload"+ID).append(html);
                $('#id_comment'+ID).val('').removeClass("greyout").focus();
            }
        });
    }
    return false;
});

You are binding the click function too many times. You only should call .live("click", function() {}); Once per page load. Or else you should use die() to unbind the functions before calling live() again.

I still think this is the answer. Change the click .live call to be:

$(".comment_submit").die("click").live("click",function() {
    var ID = $(this).attr('id');

    var content_type = $('#id_content_type'+ID).val();
    var timestamp = $('#id_timestamp'+ID).val();
    var security_hash = $('#id_security_hash'+ID).val();
    var comment = $('#id_comment'+ID).val();
    var dataString = 'content_type='+ content_type +'×tamp='+ timestamp +'&security_hash=' + security_hash + '&comment=' + comment + '&object_pk=' + ID;

    if (comment=='') {
        alert('Please enter a comment');
    } else {
        $('#id_comment'+ID).val('').addClass("greyout");
        $.ajax({
            type: "POST",
            url: "{% comment_form_target %}",
            data: dataString,
            cache: false,
            success: function(html){
                $("#commentload"+ID).append(html);
                $('#id_comment'+ID).val('').removeClass("greyout").focus();
            }
        });
    }
    return false;
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文