Django проверяет поля в наборе форм относительно другой формы, обрабатываемой одновременно - PullRequest
1 голос
/ 05 ноября 2010

Это может быть немного сложно, или я просто запутался

У меня есть две формы на одной странице.Один - это форма, а другой - это набор форм.Моя цель состоит в том, чтобы проверить поля в форме набора по полям в форме.Я предполагаю, что в настоящее время происходит то, что метод, которым я передаю идентификатор формы проекта в набор форм, происходит таким образом, что его не выбирают для проверки наборов форм.

Ошибка на

if target > project.target_date:

Значение исключения: объект 'NoneType' не имеет атрибута 'target_date'

Код, который в настоящее время работает без проверки: Примечание. Я настраиваю проект, чтобы разрешить нулевое значение в модели этапов.Я бы предпочел, чтобы он не допускал null, но это был единственный способ, которым я мог выяснить, как передать project_id в форму Milestones.

View.py

def ProjectAdd(request): #Finish the template
    qs = Project.objects.none()
    if request.method == 'POST':
        form = ProjectAddForm(request.POST)
        formset = MilestoneFormSet(request.POST)
        if form.is_valid() and formset.is_valid():
            project = form.save()
            instances = formset.save(commit=False)
            for instance in instances:
                instance.project_id = project.id
                instance.save()
            return HttpResponseRedirect(reverse('project.views.detail', args=(project.id,)))
    else:
        form = ProjectAddForm()
        formset = MilestoneFormSet(queryset=qs)
    return render_to_response('project/addProjectForm.html', {
        'form': form,
        'formset': formset,
        'current_date': current_date,
    }, context_instance=RequestContext(request))

Models.py

class Milestone(models.Model):
    project = models.ForeignKey(Project, blank=True, null=True)
    target_date = models.DateField('Target Date')

forms.py

MilestoneFormSet = modelformset_factory(Milestone, extra=1, max_num=50)

Код, который я хотел бы иметь работус проверкой.Прямо сейчас все то же самое, за исключением forms.py:

forms.py

class MilestoneForm(forms.ModelForm):

    def clean(self):
        if any(self.errors):
            raise forms.ValidationError("")
        data = self.cleaned_data
        target = data["target_date"]
        project = data["project"]
        if target > project.target_date:
            raise forms.ValidationError("Target Date is beyond the project target date - Project Target: %s" % target)
        if target < project.start_date:
            raise forms.ValidationError("Target Date is before the start date of the project - Project Start: %s" % project.start_date)
        return data

MilestoneFormSet = modelformset_factory(Milestone, form=MilestoneForm, extra=1, max_num=50)

1 Ответ

1 голос
/ 06 ноября 2010

Проблема в том, что Milestone.project может быть None.

Когда вы делаете project = data['project'], чек следует за if project is None: raise forms.ValidationError('No project is assigned to this milestone.'

Я упоминал об этом ваш предыдущий вопрос тоже , должно быть, пропустил:).

...