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

Django DRY - how to simplify similar views using same template?

请注意:为了清楚起见,“[app_name]”是实际应用名称的占位符。不是 Django 替换代码。想象一下它说 'Stuff' 而不是 [app_name],如果它令人困惑的话。

我的问题:

  1. 如何使它更干?

代码重复很多,一定要有办法统一一部分。如果您确实回答了,请明确写下内容和原因,我将不胜感激。由于很多答案都假设有相当多的知识,而且我正在尝试养成 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 %}

从我的角度来看,一切都很好,在这种情况下不需要再抽象了。在这一点上,您似乎可以对其进行优化 - 但您搭建的脚手架 不包含任何逻辑 。在幕后 django 已经为您提供了很多帮助 在此不再赘述!

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

如果你有一组共享很多属性的模型并且表示 django 提供了像 abstract base classes for models properties and methods or the include and extends 模板标签这样的机制,如果你需要共享表示。关于应该共享的视图逻辑,您可以编写自己的模块甚至包来执行您需要做的任何事情,并在您的视图中使用它们。

如果没有真正的用例,你不应该考虑如何在这一点上不重复自己。