2010-11-03 74 views
0

我試圖建立一個項目列表,當我建立一個項目時,它有一個項目編號(例如10-1000)。我希望能夠添加一個新項目並將其附加1到項目編號中(例如,下一個項目編號將爲10-1001)。我在確定第一步時遇到了一些麻煩。遞增1 1

這裏是我的models.py

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') 
    quote = models.CharField(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) 

    #get the current status of the projectget_value_display 
    def current_status(self): 
     try: 
      return self.status.all().order_by('-id')[:1][0] 
     except: 
      return None 

我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 
      today = datetime.date.today() 
      project.quote = "%s-%s" % (str(today.year)[2:4], project.quote) 
      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)) 

和我forms.py

class AddSingleProjectForm(ModelForm): 
    status = forms.ChoiceField(choices=STATUS_CHOICES) 
    def __init__(self, *args, **kwargs): 
     super(AddSingleProjectForm, self).__init__(*args, **kwargs) 
     self.fields['status'].initial = self.instance.current_status() 

    class Meta: 
     model = Project 
     exclude = ('pre_quote', 'created_by') 

    def save(self, force_insert=False, force_update=False, commit=True): 
     f = super(AddSingleProjectForm, self).save(commit=False) 
     if commit: 
      f.save() 
      print "form save method was called with commit TRUE" 
     return f 

任何建議,將不勝感激。
謝謝大家!

+0

我認爲「報價」字段是你想要這些數字去的地方?您在文中將其一致地稱爲「項目編號」。其次,表單的Meta.exclude中的'pre_'前綴是什麼意思? – 2010-11-03 18:58:28

+0

是的報價字段將是項目編號。我很抱歉,那是我忘記刪除的一段舊代碼。 – TheLifeOfSteve 2010-11-03 19:17:00

回答

0

它在我看來,你的「報價」是兩件事:單調遞增的「項目編號」和一年。既然他們是這樣,他們有一個規則的結構。從表單中排除它們並完全查看,然後創建兩個新字段:「quote_year」和「quote_id」。然後

您節省會是這個樣子:

def save(self, *args, **kwargs): 
    if not self.quote_year and not self.quote_id: 
     self.quote_year = datetime.date.today().year % 100 
     quote_ids = self.objects.filter(quote_year = self.quote_year).order_by('-quote_id') 
     self.quote_id = 1 
     if quote_ids.exists(): 
      self.quote_id = quote_ids[0].quote_id + 1 
    super(Project, self).save(*args, **kwargs) 

這基本上測試,看看是否有本年度任何quote_ids,如果沒有,初始化爲1,否則初始化到最高quote_id加1.

爲了保存自己的悲痛一再渲染報價ID,將它添加到您的型號還有:

@property 
def quote(self): 
    return '%02d-%05d' % (self.quote_year, self.quote_id) 

我的代碼assum希望每年的第一個項目都要將項目的一部分重置爲零。

+0

非常感謝。 – TheLifeOfSteve 2010-11-04 19:04:57