【问题标题】:Django post duplicates on page refreshDjango在页面刷新时发布重复项
【发布时间】:2015-04-18 09:15:14
【问题描述】:

我有这个视图可以添加对主题的回复:

@login_required
def post_reply(request, topic_id):
    tform = PostForm()
    topic = Topic.objects.get(pk=topic_id)
    args = {}
    if request.method == 'POST':
        post = PostForm(request.POST)

        if post.is_valid():

            p = post.save(commit = False)
            p.topic = topic
            p.title = post.cleaned_data['title']
            p.body = post.cleaned_data['body']
            p.creator = request.user
            p.user_ip = request.META['REMOTE_ADDR']

            p.save()

            tid = int(topic_id)


        args['topic_id'] = tid
        args['topic'] = topic
        args['posts'] = Post.objects.filter(topic_id= topic_id).order_by('created')
        return render_to_response("myforum/topic.html",args)            

    else:
        args.update(csrf(request))
        args['form'] = tform
        args['topic'] = topic
        return render_to_response('myforum/reply.html', args, 
                                  context_instance=RequestContext(request))

问题是当用户在发布回复后引用该页面时,她的回复被重复了。如何避免这种情况?

更新:这里是相关模板:

{% extends "base.html"%}
{% load static %}


{% block content%}

<div class="panel">
    <div class="container">
<!-- Posts  -->
<div class="col-md-12">
    <h3>{{ topic.title }}</h3>
<table class="table table-striped">

    <tr class="col-md-9"><td>{{ topic.description }}</td></tr>
    <tr class="col-md-3"><div class="userpanel"><td>{{ topic.created }}</td></div></tr>

    {% for post in posts %}
         <tr class="col-md-12 userpanel"><td>{{ post.title }}</td></tr>


        <tr class="">
            <td>
               <div class="col-md-9 userpanel">{{ post.body }} <br> {{ post.created }} </div> 
            </td>
            <td>
                <div class="col-md-3 userpanel">{{ post.creator }} <br> {{ post.created }} </div>
            </td>
        </tr>

    {% endfor %}
</table>

<hr />
<!-- Next/Prev page links  -->
{% if posts.object_list and posts.paginator.num_pages > 1 %}
<div class="pagination">
    <span class="step-links">
        {% if posts.has_previous %}
            <a href= "?page={{ posts.previous_page_number }}">previous &lt;&lt; </a>
        {% endif %}

        <span class="current">
            &nbsp;Page {{ posts.number }} of {{ topics.paginator.num_pages }}
        </span>

        {% if posts.has_next %}
            <a href="?page={{ posts.next_page_number }}"> &gt;&gt; next</a>
        {% endif %}
    </span>
</div>
{% endif %}
<a class="button" href="/forum/reply/{{topic.id}}"> Reply </a>

</div> <!-- End col-md-12  -->

</div> <!-- End container  -->
</div>

{% endblock %}

【问题讨论】:

  • 我认为您的问题出在前端。如果 Django 正在接收一个帖子,它将处理一个帖子。
  • @levi 我添加了模板。

标签: django django-views


【解决方案1】:

总是 - 我重复一遍,总是在 POST 之后重定向。

因此,当您的表单有效时,不要执行return render_to_response("myforum/topic.html",args),而是执行return HttpResponseRedirect(url_of_your_view) (https://docs.djangoproject.com/en/1.7/ref/request-response/#django.http.HttpResponseRedirect)

OP 的 cmets 后更新:

您应该使用反向 (https://docs.djangoproject.com/en/1.7/ref/urlresolvers/#reverse) 来创建要重定向到的 url:

return HttpResponseRedirect(reverse('myforum.views.topic', args=[topic_id]))

另外,我建议为您的视图命名(并删除用于定义它们的字符串,因为它们已被弃用),因此更改您的 urls.py 行,如下所示: from myforum.views import topic ... url(r'^topic/(\d+)/$', topic, name='view_topic'), ...

然后只需执行reverse('view_topic', args=[topic_id]) 即可获取视图的网址。

【讨论】:

  • 是的,总是。这绝对不限于 Django,你应该在任何 web 框架中这样做。
  • 好的。请您详细说明如何将页面附加到 HttpResponseRedirect 中的 url_of_my_view ?
  • 渲染该视图的 urls.py 条目是什么?
  • 奇怪的是我现在得到这个错误:Reverse for 'myforum.views.topic' with arguments '(u'2',)' and keyword arguments '{}' not found. 0 pattern(s) tried: [](其中2是topic_id)
  • @supermario 硬编码网址不是 DRY!您能否尝试我的建议,将 name='view_topic' kwarg 添加到 url,然后使用 reverse('view_topic', args=[topic_id])
猜你喜欢
  • 2011-07-02
  • 2017-03-16
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
相关资源
最近更新 更多