首页 > 解决方案 > 如何在基于 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'

标签: djangovariablesmethodsview

解决方案


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对对象内的数据进行编码


推荐阅读