Django DRY - 如何使用相同的模板简化类似的视图?

时间:2017-09-29 20:10:42

标签: django dry

请注意:只是为了明确' [app_name]'是实际应用名称的占位符。不是Django替换代码。试想一下它说的东西'而不是[app_name],如果它令人困惑。

我的问题:

  1. 如何让这更干?
  2. 有很多代码重复,必须有一种统一其中一些的方法。如果你回答,如果你明确写出什么和为什么,我将非常感激。由于很多答案都假定了相当多的知识,我正在努力养成Django编码风格和实践的良好习惯。谢谢你的时间。

    [APP_NAME] /urls.py

    from django.conf.urls import url
    
    from . import views
    
    app_name = 'things'
    urlpatterns = [
        url(r'^cars/$', views.CarThingIndexView.as_view(), name='Car_index'),
        url(r'^trees/$', views.TreeThingIndexView.as_view(), name='Tree_index'),
        ....
    ]
    

    [APP_NAME] /model.py

    from django.db import models    
    class Tree(models.Model):
            """
            Tree
            """
            name_text = models.CharField(max_length=200)
    
    def __str__(self):
        return self.name_text
    
    class Car(models.Model):
            """
            Car
            """
            name_text = models.CharField(max_length=200)
    
    def __str__(self):
        return self.name_text
    

    [APP_NAME] /view.py

    from django.views import generic
    
    from inventory.models import Car, Tree
    
    
    class CarThingIndexView(generic.ListView):
        template_name = '[app_name]/index.html'
        context_object_name = 'thing_list'
    
        def get_queryset(self):
            return Car.objects.values()
    
    
    class TreeThingIndexView(generic.ListView):
        template_name = '[app_name]/index.html'
        context_object_name = 'thing_list'
    
        def get_queryset(self):
            return Tree.objects.values()
    

    [APP_NAME] /模板/ [APP_NAME] /index.html

    {% extends '[app_name]/base.html' %}
    {% block content %}
        {% if thing_list %}
    
            <ul>
                {% for item in thing_list %}
                    <li>
                        <p>
                            {{ item }}
                        </p>
                    </li>
                {% endfor %}
            </ul>
        {% else %}
            <!-- I am pretty sure if there are no objects this will not work, please correct me if I am wrong {{ obj | get_class_name }}. I would like it to read "No Tree/Car are available." -->
            <p>No [class_name] are available.</p>
        {% endif %}
    {% endblock content %}
    

1 个答案:

答案 0 :(得分:2)

从我的观点来看,一切都很好,在这种情况下不需要抽象。在这一点上看起来你可以优化它 - 但你的脚手架不包含任何逻辑。在幕后 django已经帮助了你很多在这里不再重复!

现在,当您开始实施汽车和树木的功能时,viewsmodelstemplates将朝不同的方向发展。在名称旁边,它们将具有不同的属性。它们表现不同,显示不同。这是您的应用程序中经常发生的情况。

如果您有一组共享大量属性的模型,则表示django为模型属性和方法或abstract base classesinclude模板标记提供extends等机制,如果你需要分享陈述。关于应该共享的视图逻辑,您可以编写自己的模块甚至包来做任何您需要做的事情并在视图中使用它们。

如果没有真实的用例,你不应该考虑如何不重复自己。