【问题标题】:How to DRY out my Django Views如何干燥我的 Django 视图
【发布时间】:2016-05-07 14:08:24
【问题描述】:

随着我的 Django 技能水平的提高,我开始以不同的方式看待我的代码,并且迫切希望找到一种方法来避免在我的观点中重复自己 - 如下所示。将不胜感激如何设置我的视图的示例。谢谢。

# -*- coding: utf-8 -*-
from django.shortcuts import render
from listings.models import Listing
from posts.models import Reveal


def home(request):
    return render(request, "pages/home.html", {})


def about(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, 'pages/about.html', {'listings': listings, 'reveals': reveals})


def team(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, "pages/theteam.html", {'listings': listings, 'reveals': reveals})


def why(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, "pages/why.html", {'listings': listings, 'reveals': reveals})


def services(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, "pages/services.html", {'listings': listings, 'reveals': reveals})


def selling_facts(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, "pages/selling_facts.html", {'listings': listings, 'reveals': reveals})


def buying_facts(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, "pages/buying_facts.html", {'listings': listings, 'reveals': reveals})


def liquor_licenses(request):
    reveals = Reveal.objects.all().order_by('?')[:1:1]
    listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
    return render(request, "pages/liquor_licenses.html", {'listings': listings, 'reveals': reveals})


def contact(request):
    return render(request, "pages/contact.html", {})

【问题讨论】:

    标签: django django-models django-templates django-admin django-views


    【解决方案1】:

    您可以通过定义一个 url 命名参数来更改您的 url 以反映它的用途。您可以在单个视图中捕获它并根据该参数呈现不同的页面:

    # url definition
    url(r'^pages/(?P<page>\w+)/$', views.render_pages, name='render-pages')
    
    # your views
    from django.http import Http404
    
    def _get_template_by_parameter(page):
        if page == 'about':
            return 'pages/about.html'
        elif page == 'team':
            return 'pages/theteam.html'
        # some more branches here
        return None
    
    def render_pages(request, page):
        reveals = Reveal.objects.all().order_by('?')[:1:1]
        listings = Listing.objects.filter(featured_choices="YES").order_by('?')[:1:1]
        template = _get_template_by_parameter(page)
        if template:
            return render(request, template, {'listings': listings, 'reveals': reveals})
        else:
            raise Http404
    

    您可以访问您的网址,例如:http://test.com/pages/abouthttp://test.com/pages/team。显然你需要更好的措辞,因为我只是快速编写代码。

    【讨论】:

    • 谢谢尚;这看起来更干净!今晚我坐下来工作时会试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多