2010-10-19 2 views
3

Вот моя проблема. Я новичок в python/django (около 2 месяцев). У меня есть 2 таблицы, проект и статус. У меня есть внешний ключ, указывающий от статуса к проекту, и я пытаюсь показать значение внешнего ключа (состояния) в шаблоне проекта, а не адрес внешнего ключа.Отображение значения внешнего ключа в шаблоне Django

Вот мой 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") 

Мой views.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 %} 

Любая помощь будет оценена. Спасибо!

ответ

6

Я предполагаю, что вы имеете в виду здесь:

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

Это не делает ничего. select_related - это функция оптимизации, она не имеет ничего общего с фактическим получением или отображением связанного контента. Если вы хотите это сделать, вам придется перебирать результат p.status_set.all.

+0

Да, это место точно. Итак, вы говорите, что мне нужно пройти через p.status_set.all? Извините, я все еще новичок в этом. – TheLifeOfSteve

+0

Да, потому что у вас есть несколько статусов для каждого 'p'. Если это не то, что вы хотите, ваша модельная структура может быть неправильной. –

+0

спасибо. У меня это работает – TheLifeOfSteve

2

В вашей модели вы определили родственное имя для этого ForeignKey как «статус». Таким образом, теперь вы можете использовать «статус», как это имя, а не бизнес «_set».

Поскольку это поле ForeignKey (ManyToOne), вы не можете просто отображать поле, как если бы имелось только одно значение. Вместо этого вам понадобится .all, который вернет запрос всех статусов, указывающих на объект. Затем вы можете перебирать их.

Если вы знаете, что каждый проект будет иметь только один статус, вы можете использовать поле OneToOne вместо ForeignKey.

Смежные вопросы