增加一个知识点,当表中有多对多关联时,在前端展示的时候是一个列表,所以在展示的时候需要这样做;
表结构:
class ProjectEnv(models.Model):
project = models.ForeignKey(verbose_name='项目', to='Project')
env_choices = (
(1, '测试'),
(2, '正式')
)
env = models.IntegerField(verbose_name='环境', choices=env_choices)
path = models.CharField(verbose_name='线上部署路径', max_length=128)
servers = models.ManyToManyField(verbose_name='服务器', to='Server')
前端页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h1 class="container">环境展示</h1>
<div class="container">
<form action="" method="post">
{% csrf_token %}
<a href="{% url 'web:addprojectenv' %}" class="btn btn-success">添加数据</a>
<table class="table table-hover">
<thead>
<tr>
<td>序号</td>
<td>项目</td>
<td>环境</td>
<td>线上部署路径</td>
<td>服务器</td>
<td>操作</td>
</tr>
</thead>
<tbody>
{% for d in data %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ d.project.title }}</td>
<td>{{ d.env }}</td>
<td>{{ d.path }}</td>
<td>
<---->d.servers.values点出来的是一个queryset类型是一个列表,所以循环这个列表,然后获取每一个字典的值就行</---->
{% for datum in d.servers.values %}
{{ datum.hostname }}
{% endfor %}
</td>
<td>
<a href="{% url 'web:editprojectenv' d.id %}" class="btn btn-info">编辑</a>
<a href="{% url 'web:deleteprojectenv' d.id %}" class="btn btn-danger">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</form>
</div>
</body>
</html>
还有一个方法就是在models文件里写一个方法,将这个对象获取写一个列表推导式
class ProjectEnv(models.Model):
project = models.ForeignKey(verbose_name='项目', to='Project')
env_choices = (
(1, '测试'),
(2, '正式')
)
env = models.IntegerField(verbose_name='环境', choices=env_choices)
path = models.CharField(verbose_name='线上部署路径', max_length=128)
servers = models.ManyToManyField(verbose_name='服务器', to='Server')
def get_hostname(self):
return ','.join([i["hostname"] for i in self.servers.values()])