Один CreateView в django для отправки нескольких данных ModelForm в несколько моделей - PullRequest
0 голосов
/ 13 июля 2020

У меня несколько моделей форм образуют несколько моделей. Мне нужен один CreateView для отправки всех значений. У меня есть три модели (сотрудник, опыт работы и образование). Модели соединяются друг с другом с помощью ForeignKey.

forms.py:

class EmployeeAddModelForm(forms.ModelForm):
    """
    Creates a form for employee invitations
    """
    class Meta:
        model = Employee
        fields = [
            'e_id',
            'first_name',
            'last_name',
            'gender',
            'religion',
]
class WorkExperienceForm(forms.ModelForm):
    """
    Creates a form for saving employee work experiences
    """
    class Meta:
        model = WorkExperience
        fields = [
            'previous_company_name',
            'job_designation',
            'from_date',
            'to_date',
            'job_description',
        ]
class EducationForm(forms.ModelForm):
    """
    Creates a form for saving educational info of an employee
    """
    class Meta:
        model = Education
        fields = [
            'institution_name',
            'degree',
            'passing_year',
            'result',]
       

У меня есть три формы модели из трех моделей в form.py. Я хочу, чтобы мое createview унаследовало все эти модели и создавало единую форму для публикации данных.

views.py:

class EmployeeAddView(LoginRequiredMixin,CreateView):
    """
    Creates new employee
    """
    login_url = '/authentication/login/'
    template_name = 'employee/employee_add_form.html'
    form_class = EmployeeAddModelForm
    work_form_class = WorkExperienceForm
    queryset = Employee.objects.all()

    def form_valid(self, form):
        print(form.cleaned_data)
        return super().form_valid(form)

    def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)
    work_form = self.work_form_class(request.POST, prefix='work_form')
    education_form = self.education_form_class(request.POST, prefix='education_form')

    if form.is_valid() and work_form.is_valid():
        instance = form.save()
        work = work_form.save(commit=False)
        education = education_form.save(commit=False)
        work.employee = instance
        education.employee = instance
        work.save()
        education.save()

    if not education_form.is_valid():
        print("Education") 
        return redirect('employee:employee-list')

    def get_success_url(self):
        return reverse('employee:employee-list')

Я визуализирую две формы из моего класса представления. Но когда я использую 'work_form' в своем шаблоне. html, ничего не появляется.

Как я могу визуализировать все формы модели в моем представлении?

1 Ответ

1 голос
/ 13 июля 2020

переопределить функцию получения, поскольку запрос получения не может получить work_form по умолчанию

def get(self, request, *args, **kwargs):
    form = self.form_class(**self.get_form_kwargs())
    work_form = self.work_form_class(prefix='work_form')
    return render(request, self.template_name, {'form': form, 'work_form': work_form})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...