【问题标题】:How to remove session variable in a template after it's job is done in django如何在 django 中完成工作后删除模板中的会话变量
【发布时间】:2016-02-23 15:34:54
【问题描述】:

我有一个名为 dashboard 的应用程序,我可以在其中重定向所有已登录的用户,并可选择按用户添加文章。

用户点击表单中的提交按钮后,数据通过 POST 发送到/dashboard/article/save URL,数据存储后,视图返回HttpResponseRedirectshow_dashboard,它使用会话变量呈现dashboard.html result.

在仪表板模板文件中,我添加了一个 notify.js 代码来向用户显示确认信息。问题是如果定义了这个会话变量,每次显示仪表板页面时,即使用户没有添加文章也会触发通知。

(我是使用网络框架的新手,所以我不知道这一切如何正常工作)

一些代码:

dashboard/models.py:

class Article(models.Model):

    id = models.IntegerField(primary_key=True)
    ar_title = models.CharField(max_length=25)
    ar_data = models.CharField(max_length=500)
    user = models.ForeignKey(User,on_delete=models.CASCADE)

    def getArticleTitle(self):
        return self.title

    def getArticleData(self):
        return self.title

    def getArticleAuthor(self):
        return self.user

dashboard/urls.py:

urlpatterns = [
    url(r'^$', views.show_dashboard,name='home_dashboard'),
    url(r'^profile/save/', views.save_profile,name="save_profile"),
    url(r'^newsfeed/', views.get_newsfeed,name="newsfeed",),
    url(r'^profile/', views.show_profile,name="show_profile"),
    url(r'^article/save/', views.add_new_article,name="add_new_article"),
]

dashboard/views.py:

@login_required
def show_dashboard(request):
    return render(request,'dashboard/dashboard.html',{'form':NewArticleForm()})

def add_new_article(request):
    if(request.method == 'POST'):
        ar_title= request.POST['ar_title']
        ar_data = request.POST['ar_data']
        user = request.user
        form = NewArticleForm(request.POST)
        if(form.is_valid()):
            Article.objects.create(ar_title=ar_title,ar_data=ar_data,user=user)
            request.session["result"] = "add_article_OK"
            return HttpResponseRedirect(reverse('home_dashboard'))

dashboard.html:

{% ifequal request.session.result 'add_article_OK' %}
    <script>
        $.notify("New article added successfully", 
            {position:"bottom right","className":"success","autoHide":"yes","autoHideDelay":"3000"});
    </script>
{% endifequal %}

现在,如何在显示消息后删除此会话值?我知道del request.session['result'] 可以发出,但我可以将它放在这一系列动作中的什么位置?

【问题讨论】:

    标签: python django django-templates python-3.4 django-sessions


    【解决方案1】:

    show_dashboard 视图中执行此操作。

    不是从模板中的会话中获取值,而是在视图中弹出并传递给模板;这样您就可以一次搞定并清理它。

    @login_required
    def show_dashboard(request):
        context = {
            'form': NewArticleForm(),
            'result': request.session.pop('result', None)
        }
        return render(request,'dashboard/dashboard.html',context)
    
    ...
    {% ifequal result 'add_article_OK' %}
    

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2021-09-15
      • 1970-01-01
      • 2011-11-27
      • 2011-02-02
      相关资源
      最近更新 更多