【问题标题】:Showing the Foreign Key value in Django template在 Django 模板中显示外键值
【发布时间】:2011-04-27 13:06:12
【问题描述】:

这是我的问题。我是 python/django 的新手(大约 2 个月)。我有 2 个表,项目和状态。我有一个从状态指向项目的外键,我希望尝试在我的项目模板上显示外键(状态)的值,而不是外键的地址。

这是我的models.py

from django.db import models
from clients.models import Clients
from django.contrib.auth.models import User
from settings import STATUS_CHOICES

from django.db import models
from clients.models import Clients
from django.contrib.auth.models import User
from settings import STATUS_CHOICES

class Project(models.Model):
   client = models.ForeignKey(Clients, related_name='projects')
   created_by = models.ForeignKey(User, related_name='created_by')


#general information
   proj_name = models.CharField(max_length=255, verbose_name='Project Name')
   pre_quote = models.CharField(max_length=3,default='10-')
   quote = models.IntegerField(max_length=10, verbose_name='Quote #', unique=True)
   desc = models.TextField(verbose_name='Description')
   starts_on = models.DateField(verbose_name='Start Date')
   completed_on = models.DateField(verbose_name='Finished On')

   def __unicode__(self):
      return u'%s' % (self.proj_name)   


class Status(models.Model):
  project = models.ForeignKey(Project, related_name='status')
  value = models.CharField(max_length=20, choices=STATUS_CHOICES,                     verbose_name='Status')
  date_created= models.DateTimeField(auto_now=True) 

  def __unicode__(self):
     return self.value

  class Meta:
      verbose_name = ('Status')
      verbose_name_plural = ("Status")

我的意见.py

@login_required
 def addProject(request):
 if request.method == 'POST':
      form = AddSingleProjectForm(request.POST)
      if form.is_valid():
        project = form.save(commit=False)
        project.created_by = request.user  
        project.save()
        project.status.create(
                value = form.cleaned_data.get('status', None)
        )            
        return HttpResponseRedirect('/project/')
 else:
    form = AddSingleProjectForm()

 return render_to_response('project/addProject.html', {
 'form': form, 'user':request.user}, context_instance=RequestContext(request))

最后是我的模板:

{% if project_list %}
<table id="plist">
    <tr id="plist">
        <th>Quote #</th>
        <th>Customer</th>
        <th>Date</th>
        <th>Project Name</th>
        <th>Status</th>
        <th>Contact</th>
    </tr id="plist">
    {% for p in project_list %}
    <tr id="plist">
        <td><a href="/project/{{ p.id }}/view">{{ p.pre_quote }}{{ p.quote }}</a></td>
        <td>{{ p.client }}</td>
        <td>{{ p.starts_on }}</td>
        <td>{{ p.proj_name }}</td>
        <td>{{ p.status_set.select_related }}</td>
    <td>{{ p.created_by }}</td>
    </tr>
     {% endfor %}
    </table>

{% else %}
    <p>No projects available.</p>
{% endif %}

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python django django-models django-templates


    【解决方案1】:

    在您的模型中,您已将此 ForeignKey 的相关名称定义为“状态”。因此,您现在可以使用“status”作为此名称,而不是“_set”业务。

    由于这是一个 ForeignKey (ManyToOne) 字段,您不能简单地将该字段显示为只有一个值。相反,您需要 .all,它将返回指向相关对象的所有状态的查询集。然后你可以遍历这些。

    如果您知道每个项目只有一个状态,则可以使用 OneToOne 字段而不是 ForeignKey。

    【讨论】:

      【解决方案2】:

      我猜你的意思是:

      <td>{{ p.status_set.select_related }}</td>
      

      这没有任何作用。 select_related 是一项优化功能,与实际获取或显示相关内容无关。如果你想这样做,你将不得不遍历p.status_set.all 的结果。

      【讨论】:

      • 是的,正是那个地方。那么你是说我需要遍历 p.status_set.all 吗?抱歉,我还是新手。
      • 是的,因为每个p 都有多个状态。如果这不是您想要的,那么您的模型结构可能是错误的。
      猜你喜欢
      • 2016-09-14
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2021-10-24
      • 2017-09-22
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多