Django DRY - 如何使用相同的模板简化相似的视图?
Django DRY - how to simplify similar views using same template?
请注意:为了清楚起见,“[app_name]”是实际应用名称的占位符。不是 Django 替换代码。想象一下它说 'Stuff' 而不是 [app_name],如果它令人困惑的话。
我的问题:
- 如何使它更干?
代码重复很多,一定要有办法统一一部分。如果您确实回答了,请明确写下内容和原因,我将不胜感激。由于很多答案都假设有相当多的知识,而且我正在尝试养成 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 已经为您提供了很多帮助 在此不再赘述!
当您现在开始为您的汽车和树木实现功能时,views
、models
和 templates
将朝着不同的方向发展。在名称旁边,它们将具有不同的属性。他们的行为不同,表现也不同。这是您的应用程序中经常发生的情况。
如果你有一组共享很多属性的模型并且表示 django 提供了像 abstract base classes for models properties and methods or the include and extends 模板标签这样的机制,如果你需要共享表示。关于应该共享的视图逻辑,您可以编写自己的模块甚至包来执行您需要做的任何事情,并在您的视图中使用它们。
如果没有真正的用例,你不应该考虑如何在这一点上不重复自己。
请注意:为了清楚起见,“[app_name]”是实际应用名称的占位符。不是 Django 替换代码。想象一下它说 'Stuff' 而不是 [app_name],如果它令人困惑的话。
我的问题:
- 如何使它更干?
代码重复很多,一定要有办法统一一部分。如果您确实回答了,请明确写下内容和原因,我将不胜感激。由于很多答案都假设有相当多的知识,而且我正在尝试养成 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 已经为您提供了很多帮助 在此不再赘述!
当您现在开始为您的汽车和树木实现功能时,views
、models
和 templates
将朝着不同的方向发展。在名称旁边,它们将具有不同的属性。他们的行为不同,表现也不同。这是您的应用程序中经常发生的情况。
如果你有一组共享很多属性的模型并且表示 django 提供了像 abstract base classes for models properties and methods or the include and extends 模板标签这样的机制,如果你需要共享表示。关于应该共享的视图逻辑,您可以编写自己的模块甚至包来执行您需要做的任何事情,并在您的视图中使用它们。
如果没有真正的用例,你不应该考虑如何在这一点上不重复自己。