#python #django
Вопрос:
Вот мои модели
class Robot(models.Model):
robot = models.CharField(max_length=100)
short_Description = models.CharField(max_length=200)
status = models.CharField(max_length=20)
parameter = models.CharField(max_length=200)
jenkins_job = models.CharField(max_length=100, default='JenkinsJobName')
jenkins_token = models.CharField(max_length=100, default='JenkinsToken')
jenkins_build = models.CharField(max_length=10, default=0)
jenkins_build_status = models.CharField(max_length=20, default="Never Run")
def __str__(self):
return self.robot
class jenkinsHistory(models.Model):
robotName = models.ForeignKey(Robot, on_delete=models.CASCADE, blank=True, null=True)
jenkinsBuildNumber = models.CharField(max_length=100,blank=True)
jenkinsBuildStatus = models.CharField(max_length=200,blank=True)
errorMsg = models.CharField(max_length=500,blank=True)
Param = models.CharField(max_length=500,blank=True, null=True)
def __str__(self):
return self.robotName
Я назначил данные в таблице jenkinsHistory из таблицы роботов. вот код, которым я назначаю данные
def Run_data(Request,id):
if Request.method == 'POST':
pi = Robot.objects.get(pk=id)
hist = jenkinsHistory(robotName= pi,jenkinsBuildStatus='Jenkins-Running')
hist.save()
теперь я хочу показать эти данные в таблице в своем пользовательском интерфейсе. так что я написал этот взгляд
def Robot_History(Request,id):
fm = list(jenkinsHistory.objects.values('id','robotName','jenkinsBuildNumber','jenkinsBuildStatus','errorMsg','Param').filter(robotName=id))
print("hello",fm)
rob = Robot.objects.all()
return render(Request, 'hello/robotHistory.html',{'jenkinsHistory': fm,'robot': rob})
и вот мой html
{% for hist in jenkinsHistory %}
<tbody>
<tr>
<td>{{hist.id}}</td>
<td>{{hist.robotName}}</td>
<td>{{hist.jenkinsBuildNumber}}</td>
<td>{{hist.jenkinsBuildStatus}}</td>
<td>{{hist.errorMsg}}</td>
<td>{{hist.Param}}</td>
</tr>
</tbody>
{% endfor %}
Но когда я получил данные, поле внешнего ключа появилось в виде идентификатора, а не строки
но в моем администраторе django он поставляется только в виде строки
как решить эту проблему?
Ответ №1:
Вы можете использовать robotName__robot
в своем values
звонке:
jenkinsHistory.objects.values(..., 'robotName__robot',...)
и используйте это же поле в своем шаблоне:
{{ hist.robotName__robot }}
Занимаясь этим, я предлагаю вам изменить jenkinsHistory
robotName
поле » s » на «просто robot
«, поскольку это относится к внешнему ключу (или Robot
объекту), а не только к имени. Это поможет сделать ваш код менее запутанным и более читабельным.
Ответ №2:
Как robotName
и в случае с FK для robot
моделирования, когда вы получаете это через values()
, queryset возвращает вам «робота». Затем вы передаете этот robot
объект в шаблон yout с robotName
именем.
Поэтому, когда вы пытаетесь отобразить robotName
в шаблоне, он показывает вам, что это попытка id robotName__robot
:
jenkinsHistory.objects.values(..., 'robotName__robot',...)
Или вы можете сделать это в своем шаблоне:
<td>{{hist.robotName.robot}}</td>