Как передать переменную между методами внутри Django представления на основе классов - PullRequest
0 голосов
/ 14 июля 2020

У меня есть класс, который получает данные из формы, вносит некоторые изменения и сохраняет их в базе данных.

Я хочу иметь внутри несколько методов.

  • Get
  • Post
  • И еще какой-то метод, который внесет некоторые изменения в данные из формы

Я хочу, чтобы метод post сохранял данные из формы в database и передайте переменную экземпляра следующему методу. Следующий метод должен внести некоторые изменения, сохранить его в базе данных и вернуть перенаправление.

Но у меня ошибка. Объект «Сайт» не имеет атрибута «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 в 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

Вот место, где проблема: Если я использую перенаправление внутри метода публикации. Все работает хорошо. Примерно так:

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'

Ответы [ 2 ]

1 голос
/ 14 июля 2020
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 для кодирования данных в объекте

0 голосов
/ 14 июля 2020

Необходимо вернуть ответ от метода post. Этот код возвращает экземпляр Site в этих строках. Не уверен, каково предполагаемое поведение, следует использовать redirect или render.

        try:
            site_id = Site.objects.get(url=site_url)
        except ObjectDoesNotExist:
            site_instanse = form.save()
        else:
            site_instanse = site_id
        return site_instanse
...