Как разместить поля формы 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), как показано на изображении ниже.
Для достижения вышеуказанного расположения формы мы должны разместить поля вручную только в шаблоне 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
. Он может сократить количество кода в шаблоне до нескольких строк, что сделает его более удобным для сопровождения и менее подверженным ошибкам.