ФК не заселяется в форме Джанго - PullRequest
0 голосов
/ 19 октября 2010

У меня небольшой вопрос к сообществу.Мне интересно, почему мой внешний ключ не будет отображаться при переходе к форме редактирования.Когда я иду редактировать информацию, все мои данные заполняются, за исключением статуса (который является внешней клавишей, которая указывает от таблицы состояния на таблицу проекта), которая остается без выбора.Я использую один и тот же forms.py для добавления и редактирования информации.

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

Фрагмент из шаблона редактирования проекта:

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

Буду признателен за любые предложения.

Спасибо.

1 Ответ

0 голосов
/ 20 октября 2010

Я думаю, это потому, что проект определяется как ForeignKey в статусе, а не наоборот. ForeignKey - это отношения один-ко-многим. К каждому проекту может быть подключено несколько статусов.

Вот почему в экземпляре проекта вы найдете: project.status_set, а не project.status.

Вам нужно будет добавить статус в форму вручную, отыскивая последний статус, связанный с проектом. Или, возможно, измените отношение ForeignKey на отношение OneToOne, в зависимости от ваших требований.

...