Как разместить поля формы inline formsets вручную в шаблонах Django, и я хочу показывать только определенные поля в формах Template

Нам нужно разместить поля формы в определенном месте x,y и размере поля в соответствии с макетом, представленным на прикрепленном изображении, вручную на странице шаблона bootstrap, ниже представлен код models.py & forms.py

models.py:

from django.db import models
from django.utils import timezone
from datetime import datetime

def generateNewEmpID():
    today = datetime.now()
    YearMonthDay = today.strftime("%Y%m%d")
    newEmpIdPrefix = 'NT' + YearMonthDay

    try:
        last_employee_id = Employee.objects.all().last().employee_id  # Eg : NT2018012710001
    except AttributeError:
        last_employee_id = None

    if not last_employee_id:
        newEmpID = str(newEmpIdPrefix) + '10001'
        return newEmpID
    else:
        if last_employee_id[:10] == newEmpIdPrefix:

            oldEmpID_int = last_employee_id[11:]
            newEmpIDSuffix = int(oldEmpID_int) + 1

            newEmpID = newEmpIdPrefix + str(newEmpIDSuffix).zfill(5)
            return newEmpID
        else:
            newEmpID = str(newEmpIdPrefix) + '10001'
            return newEmpID


class Employee(models.Model):
    employee_id = models.IntegerField(max_length=30, default=generateNewEmpID, primary_key=True)
    first_name = models.CharField(max_length=30, blank=False, null=False)
    last_name = models.CharField(max_length=30, blank=False, null=False)
    account = models.CharField(max_length=100, blank=False, null=False)
    designation = models.CharField(max_length=30, blank=False, null=False)
    mail_id = models.CharField(max_length=100, blank=False, null=False)
    photo = models.ImageField(blank=True, upload_to='employee/photos')
    mobile_no = models.IntegerField(max_length=10)
    phone_no = models.CharField(max_length=100, blank=True, null=True)
    address = models.CharField(max_length=100)
    date_of_join = models.DateField(default=datetime.date())
    ctc_pa = models.IntegerField(max_length=10)
    pan_no = models.CharField(max_length=10)
    epfno = models.CharField(max_length=20)
    bank = models.CharField(max_length=100)
    bank_account = models.CharField(max_length=30)
    bank_ifsc = models.CharField(max_length=15)
    emergency_contact = models.CharField(max_length=100)
    created_date = models.DateTimeField(default=timezone.now)

        class Meta:
        managed = False
        db_table = 'employee'

class dependents(models.Model):
    employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    relationship = models.CharField(max_length=100)
    age = models.IntegerField(max_length=2)

    class Meta:
        managed = False
        db_table = 'emp_dependents'

class education(models.Model):
    employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE)
    course = models.CharField(max_length=100)
    branch = models.CharField(max_length=100)
    college = models.CharField(max_length=100)
    location = models.CharField(max_length=100)
    completion_date = models.DateField()
    percentage = models.IntegerField(max_length=3)

    class Meta:
        managed = False
        db_table = 'emp_education'

...................
...................
...................

forms.py

from django import forms
from .models import Employee, Education, Dependents
from django.forms import inlineformset_factory, ModelForm

class EmployeeForm(ModelForm):
    class Meta:
        model = Employee

class DependentsForm(ModelForm):
    class Meta:
        model = Dependents

class EducationForm(ModelForm):
    class Meta:
        model = Education

EmployeeDependentsFormSet = inlineformset_factory(Employee, Dependents, form=EducationForm, extra=1, can_delete=True, can_delete_extra=True)

EmployeeEducationFormSet = inlineformset_factory(Employee, Education, form=EducationForm, extra=1, can_delete=True, can_delete_extra=True)

Нам нужно показать только несколько колонок на формах шаблона в newemp.html (bootstrap), как показано на изображении ниже.

enter image description here

Для достижения вышеуказанного расположения формы мы должны разместить поля вручную только в шаблоне bootstrap.

Как создать подобную форму данных в шаблоне django с помощью bootstrap.

пробовал с базовой формой с одной моделью, но не смог сделать с отношениями родитель/ребенок(и)

Поля, которых нет в форме, должны быть необязательными

Вы должны убедиться, что поля, которые вы не отображаете в форме, являются необязательными в модели. Если вы этого не сделаете, валидация всегда будет неудачной. Пожалуйста, установите для них значение blank=True null=True, а затем выполните makemigrations, за которым следует migrations. Это включает следующие поля в модели Employee: "mail_id", "mobile_no", "ctc_pa", "pan_no", "epfno", "bank", "bank_account" и "bank_ifsc".

Примечания к коду модели

  • Используйте верблюжий регистр и единственное число для названий моделей. Вот почему я переименовал модели education и dependents. См. это.
  • Не используйте max_length kwarg с models.IntegerField. Это просто игнорируется. Обнаружено в следующих полях: Employee.ctc_pa, Employee.mobile_no, Dependent.age, Education.percentage.
  • Если вы хотите, чтобы поля даты были установлены на сейчас, вам нужно использовать auto_now_add (устанавливается при создании экземпляра), а не кварг default. Более подробную информацию смотрите в this antipattern.

Код формы

Я добавил наборы форм как свойства EmployeeForm, чтобы мы могли инкапсулировать инициализацию, валидацию и сохранение в базе данных в одном классе. Таким образом, код представления очень прост, поскольку мы можем обращаться с EmployeeForm как с любой другой формой.

Просмотр кода

Предполагается, что код нужен для целей создания. Для целей обновления достаточно создать другой подкласс UpdateView.

# views.py

class EmployeeCreateView(CreateView):
    model = Employee
    form_class = EmployeeForm
    template_name = 'employee_form.html'

    def get_success_url(self):
        return reverse('success')

Код шаблона HTML

Для создания макета, предложенного в вопросе, я использовал сетку Bootstrap. Для набора форм я использовал таблицу. Хотя это дает вам большой простор для настройки, рассмотрите возможность использования пакета django-crispy-forms. Он может сократить количество кода в шаблоне до нескольких строк, что сделает его более удобным для сопровождения и менее подверженным ошибкам.

Вернуться на верх