2016-08-11 90 views
0

我正在用Django制作一个基本的博客平台,我在编辑页面添加了一个可以保存新编辑版本的编辑页面,并且还添加了一个删除选项。当单击删除按钮时,会呈现一个新模板,要求确认或取消删除。当我点击“是”时,该帖子会根据需要自行删除,当我点击“否”时,它会返回到“编辑”页面。问题是,当它返回到'编辑'页面时,表单不再被填充,所有的字段都是空的。有没有什么办法可以配置'no'选项以返回到所有填写数据的'edit'页面?请告知如果问题不清楚。谢谢。第二次重新生成Django表单

views.py

def edit_post(request, slug): 

    post=get_object_or_404(Blog, slug=slug) 
    form = BlogForm(request.POST or None, instance=post) 

    context = { 
     'title': post.title, 
     'post': post, 
     'form': form, 
     } 

    if 'save' in request.POST: 
     if form.is_valid(): 
      post=form.save(commit=False) 
      post.save() 
      return HttpResponseRedirect(post.get_absolute_url()) 

    elif 'delete' in request.POST: 
     return render(request, 'Blog/confirm-deletion.html',delete_context) 

    #Now delete template is shown, and view takes 'yes' or 'no' option 

    elif 'yes' in request.POST: 
     post.delete() 
     messages.success(request, 'Post was successfully deleted') 
     return HttpResponseRedirect(reverse('post_list')) 

    elif 'no' in request.POST: 
     form = BlogForm(request.POST, instance=post) 
     context = { 
      'title': post.title, 
      'post': post, 
      'form': form, 
      } 
     return render(request, 'Blog/edit_post.html', context) 
     #PROBLEM HERE: CAN'T GET *NO* OPTION TO RETURN TO FILLED OUT FORM PAGE 

return render(request, 'Blog/edit_post.html', context) 

确认,deletion.html

{% extends 'Blog/base.html' %} 

{% block content %} 
<form method='POST' action = '' enctype='multipart/form-data'> {% csrf_token%} 
    <p>Are you sure you want to delete {{title}}?</p> 
    <input type = 'submit' name = 'yes' value = 'Yes'/> 
    <input type = 'submit' name = 'no' value = 'No'/> 
</form> 

{% endblock %} 

forms.py

从Django的进口形式 从.models导入博客

class BlogForm(forms.ModelForm): 
    class Meta: 
     model = Blog 
     fields = [ 
     'title', 
     'category', 
     'content', 
     'draft' 
     ] 
+0

当您单击“否”,在'

'标签的所有字段将提交给服务器。如果您想要提交博客表单域,那么您需要将表单放在同一个标​​记中。 – Alasdair

+0

@Alasdair所以重新提交到'编辑'页面的信息来自'是/否'的形式,而不是博客形式,这就是为什么字段留空? –

+0

@Alisdair,只是试了一下,完美的作品。如果你想留下你的评论作为答案,我会选择它作为最有帮助的。非常感谢您的帮助。 –

回答

0

当您提交表单时,只会提交<form>标记中的字段。例如,假设你有两个页面上的表单标签:

<form method='POST' action = '' enctype='multipart/form-data'> 
    {% csrf_token%} 
    {{ form }} 
    <input type='submit' name='submit' value='Submit' /> 
</form> 

<form method='POST' action = '' enctype='multipart/form-data'> {% csrf_token%} 
    <p>Are you sure you want to delete {{title}}?</p> 
    <input type = 'submit' name = 'yes' value = 'Yes'/> 
    <input type = 'submit' name = 'no' value = 'No'/> 
</form> 

当您单击“否”按钮,从后表单中的字段将不会被提交,因为它们以不同的形式标记。

提交表单数据,当您点击“不”,你需要在同一个标​​签的形式:

<form method='POST' action = '' enctype='multipart/form-data'> 
    {% csrf_token%} 
    {{ form }} 
    <input type='submit' name='submit' value='Submit' /> 
    <p>Are you sure you want to delete {{title}}?</p> 
    <input type = 'submit' name = 'yes' value = 'Yes'/> 
    <input type = 'submit' name = 'no' value = 'No'/> 
</form> 
0

我可能会误解你的代码,但你为什么要重新创建elif 'no'条款中的表单?其实,是不是重复什么已经完成的代码,而你就不能这样做:

elif 'no' in request.POST: 
    pass 
+0

不幸的是,如果“否”没有被点击/选择,那么用户将只保留在'confirm-deletion.html'页面上,直到选择是或否。因此,如果我在'否'上使用_pass_,我将不会选择返回到原始'编辑'页面,除非我使用我的浏览器后退按钮(这对我来说很sl so,所以我宁愿避免) –

+0

@MattCraig为什么呢?它不会执行“return render(request,'Blog/edit_post.html',context)”吗? 我看到的另一种解决方案是清除request.POST并使用它来调用edit_post函数。 –

0

当你点击“删除”就一个新的警告窗口来呢?如果是这样,而不是使'否'按钮成为提交按钮,您可以让它关闭警报框。如果它打开一个新的HTML表单,可能类似window.close()

+0

现在我只是渲染一个新的模板/ html页面,所以当'delete'被选中时,服务器会加载一个新的页面。不过,这可能是一个好主意,我可能会在后面用JavaScript来设置它(除非在Django/Python中有一个简洁的方法)? –

相关问题