Как перенести код из метода публикации в отдельный метод в Django просмотров - PullRequest
0 голосов
/ 12 июля 2020

У меня есть класс, который берет некоторую информацию из формы и вносит в нее некоторые изменения. И затем сохраняет его в базе данных. На данный момент все лог-файлы c находятся в методе 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():
            site_instanse = form.save()
            url = request.POST.get('url', '')
            if url.endswith('/'):
                url = url + "robots.txt" 
            else:
                url = url + "/robots.txt"

            robot_link = Robot(
                site = site_instanse,
                link = url,
                )
            robot_link.save()
            pk = Robot.objects.get(site=site_instanse)
            
            return redirect('checks:robots', pk.id)
        
        return render(request, self.template_name, { 'form': form })

Я хочу внести в него 2 изменения: Первое, что я хочу сделать, это переместить эту часть кода в отдельный метод

if url.endswith('/'):
    url = url + "robots.txt" 
else:
    url = url + "/robots.txt"

И второе, что я хочу сделать, это переместить эту часть кода также в отдельный метод

robot_link = Robot(
                site = site_instanse,
                link = url,
                )
robot_link.save()
pk = Robot.objects.get(site=site_instanse)
return redirect('checks:robots', pk.id)

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

1 Ответ

1 голос
/ 12 июля 2020

Нет ничего особенного в том, что Django мешает вам использовать простые функции python. Итак, если вы знаете, как определять методы и функции, вам следует использовать тот же подход. Например, первая часть может быть функцией

def get_robots_url(url):
    if url.endswith('/'):
        url = url + "robots.txt" 
    else:
        url = url + "/robots.txt"
    return url

Затем вы вызываете извлеченную функцию в том же месте

def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)
    if form.is_valid():
        site_instance = form.save()
        url = request.POST.get('url', '')
        url = get_robots_url(url)
    ....

Вы также можете определить функцию внутри класса - метод , чтобы сгруппировать код. По 2 части:

class AddSiteView(View):
...
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            site_instanse = form.save()
            url = request.POST.get('url', '')
            url = get_robots_url(url)
            return self.create_robot(site_instanse, url)
        return render(request, self.template_name, { 'form': form })

    def create_robot(self, site_instance, url):
        robot_link = Robot(
            site = site_instanse,
            link = url,
            )
        robot_link.save()
        pk = Robot.objects.get(site=site_instance)
        return redirect('checks:robots', pk.id)
   
...