【发布时间】:2016-02-11 05:38:13
【问题描述】:
我用谷歌搜索了一下,似乎 php 有很多可能性。但我还没有为 django 找到任何好的解决方案。我看到有些人为此使用客户端javascript代码,但我只是不知道如何解决这个问题。我遇到的问题是:当用户写一篇文章时,在新页面加载之前快速单击提交按钮两次,然后将发布两篇文章。这是我的代码,在此先感谢。 我的html
<form id="post_form" method="post" action="/add_post/" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" name="submit" value="submit">
</form>
我的意见.py
class PostCreateView(CreateView):
model = Post
form_class = PostForm
template_name = 'main/add_post.html'
def form_valid(self, form):
self.object = form.save(commit=False)
# any manual settings go here
#self.object.category = Category.objects.filter(category__in=categories).all()
self.object.moderator = self.request.user
self.object.image = extract(self.object.url)
self.object.thumbnail = extractt(self.object.content)
self.object.save()
return HttpResponseRedirect(reverse('post', args=[self.object.slug]))
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(PostCreateView, self).dispatch(request, *args, **kwargs)
编辑:我把它改成了这样
{% block content %}
<div class="col-sm-5">
<form id="post_form" method="post" action="/add_post/" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" id="button" name="submit" value="올리기">
</form>
</div>
<div class="col-sm-4" style="width:400px; height:250px; border:1px solid black;">
<h3>rule</h3>
</div>
<div class="col-sm-3" style="width:420px; height:750px; border:1px solid black;" >
<h3>ad</h3>
</div>
{% endblock %}
<script>
jQuery('input[name=submit]').on('click', function(){
if(jQuery(this).hasClass('active')){
return false;
}
else{
jQuery(this).addClass('active');
}
});
</script>
{% include 'footer.html' %}
最终编辑:希望这是对的吗?有什么建议吗?
import datetime
class PostCreateView(CreateView):
model = Post
form_class = PostForm
template_name = 'main/add_post.html'
def form_valid(self, form):
self.object = form.save(commit=False)
# any manual settings go here
#self.object.category = Category.objects.filter(category__in=categories).all()
self.object.moderator = self.request.user
self.object.image = extract(self.object.url)
self.object.thumbnail = extractt(self.object.content)
self.object.save()
if not hasattr(self.request.session['last_submitted']):
self.request.session['last_submitted'] = datetime.datetime.now()
return HttpResponseRedirect(reverse('post', args=[self.object.slug]))
else:
delta = datetime.datetime.now() - self.request.session['last_submitted']
if delta.seconds < 60: # assume allow re-submit after 60 seconds
return http.HttpForbidden() #or some other better message??
else:
return HttpResponseRedirect(reverse('post', args=[self.object.slug]))
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(PostCreateView, self).dispatch(request, *args, **kwargs)
使用提供的解决方案进行编辑
class PostCreateView(CreateView):
model = Post
form_class = PostForm
template_name = 'main/add_post.html'
def form_valid(self,form):
if not hasattr(self.request.session['last_submitted']):
last_submitted = pickle.dumps(datetime.datetime.now())
self.request.session['last_submitted'] = last_submitted
save_it = True
else:
last_submitted = pickle.loads(self.request.session['last_submitted'])
delta = datetime.datetime.now() - last_submitted
save_it = (delta.seconds > 60) # assume allow re-submit after 60 seconds
if save_it:
self.object = form.save(commit=False)
# any manual settings go here
#self.object.category = Category.objects.filter(category__in=categories).all()
self.object.moderator = self.request.user
self.object.image = extract(self.object.url)
self.object.thumbnail = extractt(self.object.content)
self.object.save()
return HttpResponseRedirect(reverse('post', args=[self.object.slug]))
else:
# consider redirect as usual, if the user just clicked twice by mistake
return self.form_invalid(form) # or Http error code
【问题讨论】:
标签: javascript python django