Как исправить повторяющийся код в view-функциях? - PullRequest
0 голосов
/ 05 апреля 2020

Я посмотрел один Django курс на сайте, который начинается с буквы U, и в конце у меня есть такой код. Дублирования много, и я покажу только один из них. На каждой странице я публикую sh информацию одного и того же типа, это больно смотреть на нее. Поэтому, пока я думал о двух решениях, чтобы это исправить:

  1. Создание глобальных переменных
  2. Определение функции, которая будет возвращать все эти дубликаты переменных

main.view

def home(request):
    ''' index.page '''
    site, _ = Main.objects.get_or_create(pk=1)   # (1)
    news = News.objects.all().order_by('-pk')    # (2)
    subs = SubCat.objects.all()                  # (3)
    lastNews = News.objects.all().order_by('-pk')[:3]
    popNews = News.objects.all().order_by('-show') 
    bottomPopNews = News.objects.all().order_by('-show')[:3]  # (5)
    trends = Trending.objects.all().order_by('-pk')  # (6)
    # group Subcategories in each Category
    tags = SubCat.objects.values('catid', 'catid__name').order_by('catid').annotate(count=Count('catid'))   # (4)

    Tracker.objects.create_from_request(request, site)

    return render(request, 'front/home.html', {'site' : site, 'news' : news, 'tags' : tags, 'subs' : subs, 'lastNews':lastNews, 'popNews' : popNews, 'bottomPopNews':bottomPopNews, 'trends':trends})


def about(request):
    ''' About page '''
    site, _ = Main.objects.get_or_create(pk=1)  # (1)        
    popNews = News.objects.all().order_by('-show')[:3]  

    news = News.objects.all().order_by('-pk')  # (2)
    subs = SubCat.objects.all()                # (3)
    bottomPopNews = News.objects.all().order_by('-show')[:3]  # (5)
    tags = SubCat.objects.values('catid', 'catid__name').order_by('catid').annotate(count=Count('catid')) # (4)
    trends = Trending.objects.all().order_by('-pk')    
    return render(request, 'front/about.html', {'site' : site, 'popNews':popNews,'bottomPopNews':bottomPopNews,'tags':tags,'subs' : subs,'news' : news,'trends':trends,})


def contact(request):
    ''' Contact page '''
    site, _ = Main.objects.get_or_create(pk=1)  # (1)
    popNews = News.objects.all().order_by('-show')[:3]  

    news = News.objects.all().order_by('-pk')  # (2)
    subs = SubCat.objects.all()                # (3)
    bottomPopNews = News.objects.all().order_by('-show')[:3]  # (5)
    tags = SubCat.objects.values('catid', 'catid__name').order_by('catid').annotate(count=Count('catid'))   # (4)

    form = ContactForm() 
    return render(request, 'front/contact.html', {'site' : site, 'popNews':popNews,'bottomPopNews':bottomPopNews,'tags':tags,'subs' : subs,'news' : news, 'form':form})

1 Ответ

0 голосов
/ 05 апреля 2020

Попробуйте использовать классовые представления . Таким образом, вы можете просто наследовать все ваши классы представлений от класса mixin.

class MyMixin(object):
    def get_context_data(self):
        context = super(MyMixin, self).get_context_data(self)
        site, _ = Main.objects.get_or_create(pk=1)   # (1)
        news = News.objects.all().order_by('-pk')    # (2)
        subs = SubCat.objects.all()                  # (3)
        lastNews = News.objects.all().order_by('-pk')[:3]
        popNews = News.objects.all().order_by('-show') 
        bottomPopNews = News.objects.all().order_by('-show')[:3]  # (5)
        trends = Trending.objects.all().order_by('-pk')  # (6)
        # group Subcategories in each Category
        tags = SubCat.objects.values('catid', 'catid__name').order_by('catid').annotate(count=Count('catid'))   # (4)
        context['site'] = site
        context['news'] = news
        context['tags'] = tags
        context['subs'] = subs
        context['lastNews'] = lastNews
        context['popNews'] = popNews
        context['bottomPopNews'] = bottomPopNews
        context['trends'] = trends
        return context


class HomeView(MyMixin, TemplateView):
    ''' index.page '''
    template_name = 'front/home.html'

    def get_context_data(self):
        # override for template specific actions
        context = super(HomeView, self).get_context_data(self)

        Tracker.objects.create_from_request(request, site)
        return context

class AboutPage(MyMixin, TemplateView):
    ''' About page '''
    template_name = 'front/about.html'

class ContactPage(MyMixin, TemplateView):
    ''' Contact page '''
    template_name = 'front/contact.html'
    def get_context_data(self):
        # override for template specific actions
        context = super(HomeView, self).get_context_data(self)

        form = ContactForm()
        context["form"] = form
        return context


...