在Django视图函数中是否有创建持久变量的方法?
当调用my view函数时,我当前通过GET获取一个变量在Django视图函数中是否有创建持久变量的方法?,django,django-views,Django,Django Views,当调用my view函数时,我当前通过GET获取一个变量'my_var',如图所示。我需要在POST方法中使用此变量进行查询 def article_delete_view(request, pk): my_var = request.GET.get('my_var') #GET THE VARIABLE from referring data-url obj = Listing.objects.get(type=type) # I could query here if I w
'my_var'
,如图所示。我需要在POST方法中使用此变量进行查询
def article_delete_view(request, pk):
my_var = request.GET.get('my_var') #GET THE VARIABLE from referring data-url
obj = Listing.objects.get(type=type) # I could query here if I wanted (illustration only)
article = get_object_or_404(Article, pk=pk)
data = dict()
if request.method == 'POST':
article.delete()
data['form_is_valid'] = True
articles = Article.objects.all()
obj = Listing.objects.get(name=my_var) #THIS DOES NOT WORK, since 'type' is not passed on submit.
context = {'articles':articles, 'obj':obj}
data['article_table'] = render_to_string('article_table.html', context)
else:
context = {'article':article}
data['html_form'] = render_to_string('article_delete.html', context, request=request)
return JsonResponse(data)
在提交时调用POST时,是否有最佳实践方法使该变量保持不变?我知道宣布一项全球计划是个坏主意。曾考虑将其写入内存(附在文章中),但这感觉像是一次黑客攻击。将其附加到pk
参数,然后将其拆分,感觉更糟。讨厌。我可以让我的
方法传递我的_var
,但要做到这一点,我必须重构许多其他东西才能实现。django会话变量就是答案吗?任何观点都是有帮助的。提前谢谢
更新和解决方案:
因此,为了上下文化,这里的问题是,我想在一个视图中查询一个特定的模型实例,该视图没有将该模型实例信息(pk或id)作为参数传递给它。我可以通过触发视图的数据url
获取该变量,但只能获取一次。它在POST
中不可用,或者在以后调用article\u delete\u view
时不可用
想象一下,你正试图做一个花生酱三明治,但你一次只能从碗橱里取出一件东西。你第一次去橱柜时就得到了花生酱,但是当你再次打开橱柜去拿面包时,花生酱就消失了。会话变量原来是一种节省花生酱的解决方案,你知道,就像一个小架子。滚动的有轮子的架子。无论如何:
def article_delete_view(request, pk):
my_var = request.GET.get('my_var')
if my_var is not None: #This prevents my_var from being lost subsequent function calls
request.session['session_var'] = my_var = request.GET.get('my_var') # create session variable
else:
pass
article = get_object_or_404(Article, pk=pk)
data = dict()
if request.method == 'POST':
article.delete()
data['form_is_valid'] = True
articles = Article.objects.all()
session_var = request.session.get('session_var', None) # grab the session variable here
obj = Listing.objects.get(name=session_var) # NOW THIS WORKS!
context = {'articles':articles, 'obj':obj}
data['article_table'] = render_to_string('article_table.html', context)
else:
context = {'article':article}
data['html_form'] = render_to_string('article_delete.html', context, request=request)
return JsonResponse(data)
获取my_var之后的if
可以防止会话变量在每次后续调用视图时被写入null,因为GET
只在第一次获取变量。如果有人想知道session\u var
实际上来自何处,那么下面是源代码(obj.slug):
名称
我使用GET从它在范围内的模板中获取它,因此我可以在
文章\u delete\u视图中查询它。将其作为URL参数传入不起作用,因为该模式与我的应用程序中的任何内容都不匹配。到目前为止,这是伟大的工作。如果有人有任何其他想法和/或可以告诉我为什么这是个坏主意,请发布。类型是python内置的,不要使用类型作为变量名。request.GET
是一个类似字典的对象,包含所有给定的HTTP GET参数,也称为查询参数。这不是一种方法<代码>请求。GET
也可用于post请求。Type不是实际变量。我会编辑。我最终用会话变量解决了这个问题,效果很好。但是,仍然希望有人能发布其他想法。你能用问题描述中的会话作为更新发布你所做的吗?
<button type="button" data-url="{% url 'article_delete' article.id %}?my_var={{obj.slug}}">Name</button>