#django
#джанго
Вопрос:
Я новичок в Django, начал изучать его на этой неделе. Я создал свои модели.пы вот так:
class EmployeeTrack(models.Model):
time = models.DateTimeField(default=datetime.now(), blank=False)
eid = models.ForeignKey('Employee', on_delete=models.CASCADE, null=True, blank=False, verbose_name = 'Employee')
tmp = models.DecimalField(max_digits=3, decimal_places=1, verbose_name='temperature')
class Meta:
verbose_name_plural='Employee Tracking'
class Employee(models.Model):
first_name= models.CharField(max_length=100, blank=False)
last_name= models.CharField(max_length=100, blank=False)
email= models.CharField(max_length=100, blank=False)
Теперь мой вопрос заключается в том, как я могу создать две формы. Первая форма с одним полем ввода, таким как, например, id, а затем введите идентификатор сотрудника, передайте этот идентификатор через перенаправление или что-то еще во вторую форму для модели EmployeeTrack, в которой перечислены все его поля, но также заполнено поле employee eid на основе моего предыдущего ввода в первой форме, поэтому я могу использоватьможно добавить запись EmplyoeeTrack.
Ответ №1:
Я понимаю, что вы хотите изменить модель EmployeeTrack в соответствии с идентификатором, к которому она принадлежит, для этого я бы сначала внес некоторые небольшие изменения в вашу модель:
class EmployeeTrack(models.Model):
tmp = models.DecimalField(
max_digits=3, decimal_places=1, verbose_name='temperature')
created_at = models.DateTimeField(auto_now_add=True)
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
EmployeeTrack = models.ForeignKey(EmployeeTrack, on_delete=models.CASCADE)
email = models.EmailField()
# in this way at the moment of instantiating the object you will have its data in string
def __str__(self):
return f'{self.first_name} {self.last_name}'
после этого мы создаем формы моделей:
from django.forms import ModelForm
from .models import (
Employee,
EmployeeTrack
)
class EmployeeForm(ModelForm):
class Meta:
model = Employee
fields = (
'first_name', 'last_name', 'email'
)
class EmployeeTrackForm(ModelForm):
class Meta:
model = EmployeeTrack
fields = (
'employee','tmp',
)
# what we do is add an inline formset to the form
EmployeeFormSet = inlineformset_factory(
Employee, EmployeeTrack, form=EmployeeTrackForm,
fields=['tmp', ], extra=1, can_delete=True
)
а у вашего администратора это было бы еще проще:
from django.contrib import admin
from .models import (
Employee,
EmployeeTrack,
)
class EmployeeInline(admin.TabularInline):
model = Employee,
extra = 1
@admin.register(EmployeeTrack)
class EmployeeCustom(admin.ModelAdmin):
fields = ('first_name', 'last_name', 'email')
inlines = [EmployeeInline]
и при этом у вас будет структура
Комментарии:
1. Это очень полезно, но, похоже, я неправильно сформулировал свой вопрос. Что мне нужно, так это не редактирование, а добавление новой записи EmployeeTrack через форму, которая содержит все поля из модели, включая внешний ключ, в таблицу Employee. Я хочу 2 формы. Сначала нужно просто отправить данные и отправить их в следующую форму, через перенаправление или что-то в этом роде. Первая форма просто передаст данные для идентификатора сотрудника. Затем появится вторая форма, в которой будут перечислены все ее поля, и только поле employee будет заполнено на основе переданного идентификатора employee, который будет идентичным.
2. Вы все еще плохо структурируете свой вопрос, вы хотите, чтобы из модели Employee вы могли добавлять данные в свою модель отслеживания сотрудников?
3. Извините за плохие объяснения. Я хочу добавить только запись EmployeeTrack в базу данных через форму. Сотрудники добавляются в БД через администратора django, чтобы это было покрыто. Я представлял, что во внешнем интерфейсе будет одно поле ввода для идентификатора сотрудника. Затем я хотел бы добавить запись EmployeeTrack для этого сотрудника без необходимости вручную выбирать из списка сотрудников. Я бы вообще не добавлял сотрудников через форму.
4. Большое спасибо за вашу помощь!