Увеличение предыдущей записи на 1 - PullRequest
0 голосов
/ 03 ноября 2010

Я пытаюсь настроить список проектов, где при настройке проекта он имеет номер проекта (например, 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

My 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

Любые предложения будут с благодарностью.
Спасибо всем!

1 Ответ

0 голосов
/ 03 ноября 2010

Мне кажется, что ваша "цитата" - это две вещи: монотонно увеличивающийся "номер проекта" и год.Так как это то, что они есть, они имеют регулярную структуру.Исключите их из формы и представления полностью и создайте два новых поля: "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_id для текущего года и, если нет, инициализировать до 1, в противном случае инициализировать до самого высокого quote_id плюс 1.

Чтобы избавить себя от горя, снова и снова отображая идентификатор цитаты, добавьтеэто относится и к вашей модели:

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

Мой код предполагает, что вы хотите, чтобы часть номера проекта сбрасывалась в ноль для первого проекта каждого года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...