【问题标题】:Incrementing previous entry by 1将前一个条目增加 1
【发布时间】:2010-11-03 17:51:50
【问题描述】:

我正在尝试设置一个项目列表,当我设置一个项目时,它有一个项目编号(例如 10-1000)。我希望能够添加一个新项目并将其附加 1 到项目编号(例如,下一个项目 # 将是 10-1001)。我在弄清楚第一步时遇到了一些麻烦。

这是我的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

任何建议将不胜感激。
谢谢大家!

【问题讨论】:

  • 我假设“报价”字段是您希望这些数字去的地方?您在文本中始终将其称为“项目编号”。其次,Form 的 Meta.exclude 中的“pre_”前缀是什么意思?
  • 是的,报价字段将是项目编号。抱歉,这是我忘记删除的旧代码段。

标签: python django django-models django-forms django-views


【解决方案1】:

在我看来,您的“报价”是两件事:单调递增的“项目编号”和一年。由于这就是它们,它们具有规则的结构。从您的表单和视图中完全排除它们,并创建两个新字段:“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)

我的代码假设您希望每年的第一个项目将数字的项目部分重置为零。

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 2016-01-10
    • 2022-01-20
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多