POST-запрос не работает для Django формы и Django формы - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть форма, ApplyJobForm и Formset, ApplyJobFormset. Метод GET работает, когда я передаю форму и набор форм в представление, но для пост-запроса форма и набор форм is_valid() не работают, после нажатия на кнопку отправить я возвращаюсь в представление без сохранения. Я не могу сохранить форму с помощью набора форм, я не знаю, что я делаю здесь неправильно. Вот мои коды.

models.py

class Applicants(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='applicants')
    experience = models.IntegerField(blank=True, null=True)
    cv = models.FileField(upload_to=user_directory_path)
    degree = models.CharField(choices=DEGREE_TYPE, blank=True, max_length=10)
    created_at = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return f'{self.user.get_full_name()} Applied'


class Certification(models.Model):
    applicant = models.ForeignKey(Applicants, on_delete=models.CASCADE, related_name='applicant_certifications')
    name = models.CharField(max_length=50)
    certification = models.FileField(upload_to=user_directory_path, blank=True)

    def __str__(self):
        return f'{self.user.get_full_name()} certificate'

forms.py

class ApplyJobForm(forms.ModelForm):

    class Meta:
        model = Applicants
        fields = ('job', 'degree', 'experience', 'cv')
        exclude = ('job',)
        labels = {
            'degree': 'Degree',
            'experience': 'Experience',
            'cv': 'CV',
        }
        widgets = {
            'degree': forms.Select(attrs={
                'class': 'form-control',
            }
            ),
            'experience': forms.NumberInput(
                attrs={
                    'class': 'form-control',
                }
            ),
            'cv': forms.FileInput(
                attrs={
                    'class': 'form-control',
                }
            ),
        }


ApplyFormset = modelformset_factory(
    Certification,
    fields=('name', 'certification'),
    extra=1,
    widgets={
        'name': forms.TextInput(
            attrs={
                'class': 'form-control',
                'placeholder': 'Certification name'
            }
        ),
        'certification': forms.FileInput(
            attrs={
                'class': 'form-control',
                'placeholder': 'Upload certification'
            }
        )
    }
)

views.py

def job_apply(request, job_id=None):
    template_name = 'apply_form.html'
    applyform = ApplyJobForm(request.GET or None)
    job = get_object_or_404(Job, id=job_id)
    formset = ApplyFormset(queryset=Certification.objects.none())
    if request.method == 'GET':
        context = {'applyform': applyform, 'formset': formset}
        return render(request, template_name, context)
    elif request.method == 'POST':
        applyform = ApplyJobForm(request.POST)
        formset = ApplyFormset(request.POST)
        if applyform.is_valid() and formset.is_valid():
            apply = applyform.save(commit=False)
            applyform.job = job
            apply.save()
            for form in formset:
                # so that `apply` instance can be attached.
                certification = form.save(commit=False)
                certification.apply = apply
                certification.save()
            return redirect('successful-apply')
        else:
            return redirect('job-detail', id=job.id)

    return render(request, template_name, {'applyform': applyform, 'formset': formset})

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

. html

<form class="form" method="POST" action="" enctype="multipart/form-data" role="form" autocomplete="off">
.................
</form>

1 Ответ

1 голос
/ 14 февраля 2020

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

Итак, по вашему мнению, удалите эти две строки:

        else:
            return redirect('job-detail', id=job.id)

, чтобы неверный регистр отображал формы в вашем шаблоне.

Далее, поскольку у вас есть файлы для загрузки, вам нужно инициализировать формы, для которых требуются файлы, с request.FILES:

formset = ApplyFormset(request.POST, request.FILES)

(и то же самое для applyform).

Наконец, убедитесь, что в вашем шаблоне вы также отображаете все ошибки, либо в каждом поле ({{ form.<field>.errors }}), либо в глобальном масштабе ({{ form.errors }}).

...