django - 如何在基于 Django 类的 View 中的方法之间传递变量
问题描述
我有一个类可以从表单中获取数据,进行一些更改并将其保存到数据库中。
我想在里面有几种方法。
- 得到
- 邮政
- 还有一些其他方法会对表单中的数据进行一些更改
我希望 post 方法将数据从表单保存到数据库并将实例变量传递给下一个方法。下一个方法应该进行一些更改,将其保存到数据库并返回重定向。
但我有一个错误。'Site' 对象没有属性 'get' 这是我的代码:
class AddSiteView(View):
form_class = AddSiteForm
template_name = 'home.html'
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, { 'form': form })
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# Get website url from form
site_url = request.POST.get('url')
# Check if the site is in DB or it's a new site
try:
site_id = Site.objects.get(url=site_url)
except ObjectDoesNotExist:
site_instanse = form.save()
else:
site_instanse = site_id
return site_instanse
return render(request, self.template_name, { 'form': form })
def get_robots_link(self, *args, **kwargs):
# Set veriable to the Robot Model
robots = Robot.objects.get(site=site_instanse)
# Robobts Link
robots_url = Robots(site_url).get_url()
robots.url = robots_url
robots.save()
return redirect('checks:robots', robots.id, )
我需要将 site_instanse 从 def post 传递给 def get_robots_link
这是回溯:
Internal Server Error: /add/
Traceback (most recent call last):
File "/home/atom/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/atom/.local/lib/python3.8/site-packages/django/utils/deprecation.py", line 96, in __call__
response = self.process_response(request, response)
File "/home/atom/.local/lib/python3.8/site-packages/django/middleware/clickjacking.py", line 26, in process_response
if response.get('X-Frame-Options') is not None:
AttributeError: 'Site' object has no attribute 'get'
[14/Jul/2020 10:36:27] "POST /add/ HTTP/1.1" 500 61371
这是问题所在: 如果我在 post 方法中使用重定向。一切正常。像这样:
class AddSiteView(View):
form_class = AddSiteForm
template_name = 'home.html'
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, { 'form': form })
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# Get website url from form
site_url = request.POST.get('url')
# Check if the site is in DB or it's a new site
try:
site_id = Site.objects.get(url=site_url)
except ObjectDoesNotExist:
site_instanse = form.save()
else:
site_instanse = site_id
# Set veriable to the Robot Model
robots = Robot.objects.get(site=site_instanse)
# Robobts Link
robots_url = Robots(site_url).get_url()
robots.url = robots_url
robots.save()
return redirect('checks:robots', robots.id, ) ## HERE
return render(request, self.template_name, { 'form': form })
但是如果 return redirect('checks:robots', robots.id, )
从 post 方法中删除该行并将 return self.site_instance 放在那里。并添加 def get_robots_link。它给出了错误: 'Site' object has no attribute 'get'
解决方案
class AddSiteView(View):
form_class = AddSiteForm
template_name = 'home.html'
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, { 'form': form })
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# Get website url from form
site_url = request.POST.get('url')
# Check if the site is in DB or it's a new site
try:
site_id = Site.objects.get(url=site_url)
except ObjectDoesNotExist:
site_instanse = form.save()
else:
site_instanse = site_id
self.site_instance = site_instanse #See this
return site_instanse
return render(request, self.template_name, { 'form': form })
def get_robots_link(self, *args, **kwargs):
# Set veriable to the Robot Model
robots = Robot.objects.get(site=self.site_instance)
# Robobts Link
robots_url = Robots(site_url).get_url()
robots.url = robots_url
robots.save()
return redirect('checks:robots', robots.id, )
用于self
对对象内的数据进行编码
推荐阅读
- android - 使用导航组件导航到 Android 中的目的地或操作有什么区别?
- postgresql - 如何对不一致时间范围之间的数据求和?
- r - 更改函数绘图的粒度以使绘图看起来平滑
- python-3.7 - Platypus NSGA-II 如果在 unique_ids 中没有 id 则会给出错误:TypeError: unhashable type: 'numpy.ndarray'
- python - 我们如何计算数据中客户的不稳定(相似或不同的行为)?
- excel - VBA 代码执行时间问题...为什么添加 Dim 语句会加快对空白 Sub 的调用?
- angular - 使用 ngx-translate 本地化 Angular 库
- knitr - 如何从 knitr 隐藏此消息输出?
- windows-10 - 为什么我尝试将“make”添加到路径中不允许我使用 make
- audio - 我需要一种捕获来自(游戏、网站、音乐播放器)的内部桌面音频的方法