2010-10-19 96 views
0

我有一个小问题,要求社区。我想知道为什么当我去编辑表单时我的外键不会显示出来。当我去编辑信息时,除了状态(这是一个从状态表指向项目表的外键),我的所有数据都被填充,但没有任何选择。我使用相同的forms.py来添加和编辑信息。FK不填充在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 

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) 

def current_status(self): 
     try: 
       return self.status.all().order_by('-id')[:1][0] 
     except: 
      return None 



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)) 

@login_required 
def editProject(request, proj_id): 
proj = Project.objects.get(pk=proj_id) 
if request.method == 'POST': 
    form = AddSingleProjectForm(request.POST,instance=proj) 
    if form.is_valid():  
     form.save() 
     return HttpResponseRedirect('/project/') 
else: 
    form = AddSingleProjectForm(instance=proj) 

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

forms.py

from django.db import models 
from project.models import Project, Status 
from django.forms import * 
from django import forms 
from settings import STATUS_CHOICES 

class AddSingleProjectForm(ModelForm): 
    status = forms.ChoiceField(choices=STATUS_CHOICES) 
    class Meta: 
     model = Project 
     exclude = ('pre_quote', 'created_by') 
从editproject模板

段:

{% block content %} 
<FORM METHOD="POST" ACTION=""> 
{% csrf_token %} 
<table> 
    {{ form.as_table }} 
</table> 
<input type="submit" value="Save Project"> 
</FORM> 
{% endblock %} 

任何建议将不胜感激。

谢谢。

回答

0

我认为这是因为项目被定义为ForeignKey的状态,而不是相反。 ForeignKey是一对多的关系。每个项目可以有多个状态连接到它。

这就是为什么在项目实例中你会发现:project.status_set而不是project.status

您需要通过查找连接到项目的最新状态手动将状态添加到表单。或者可能将ForeignKey更改为OneToOne关系,具体取决于您的要求。

+0

好吧,如果我手动添加到表单,我会在哪里开始呢?对不起,我还是这个新手。感谢您及时的回复! – TheLifeOfSteve 2010-10-19 20:13:16

+0

尝试覆盖'__init__'的形式。如果'__init__'获得'instance',你会发现状态('s = Status.objects.filter(project = instance).order_by(' - date_created')[0]'),并将初始值添加到self中。 status.initial = s.value'。我希望这有效(不确定)。 – OmerGertel 2010-10-19 20:24:27

+0

我加了: def __init __(self,* args,** kwargs): super(AddSingleProjectForm,self).__ init __(* args,** kwargs) self.fields ['status']。initial = self.instance .current_status() 我的forms.py,并允许我把它拉到editform。谢谢你的帮助! – TheLifeOfSteve 2010-10-20 20:18:10