Используя представления на основе классов в django, как мне вставить данные в таблицу join

Например, у меня есть 3 класса, определенные как таковые

class Timecard(models.Model):
    site_code = models.CharField(max_length=200)
    contractor_name = models.CharField(max_length=200)
    approved = models.BooleanField(default=False)
    date = models.DateTimeField(default=timezone.now)

class Job(models.Model):
    job_code = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    hourly_rate = models.DecimalField(max_digits=10, decimal_places=2)
    max_hours = models.PositiveIntegerField()
    time_card = models.ManyToManyField(Timecard, through="Timecard_Job")

class Timecard_Job(models.Model):
    time_card = models.ForeignKey(Timecard, on_delete=models.CASCADE)
    job = models.ForeignKey(Job, on_delete=models.CASCADE)
    hours_worked = models.DecimalField(max_digits=10, decimal_places=2)

У меня есть следующий класс, управляющий моим представлением

class FillTimecard(CreateView):
    model = Timecard
    form_class = CreateTimeCardForm
    template_name = 'timesheet/timesheetSubmit.html'
    success_url = reverse_lazy("index")

В итоге у меня есть следующий класс формы

class CreateTimeCardForm(forms.ModelForm):
    class Meta:
        model = Timecard
        fields = ['site_code', 'contractor_name', 'date','job']


    job = forms.ModelMultipleChoiceField(
        queryset=Job.objects.all(),
        widget=forms.Select
    )

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

Если кто-то может предоставить ресурсы, которые помогут мне достичь этого, буду признателен.

Подобно тому, что вы сделали с полем job, новое поле можно добавить в вашу форму, как объясняется в документации здесь .

По существу:

class CreateTimeCardForm(forms.ModelForm):
    job = forms.ModelMultipleChoiceField(
        queryset=Job.objects.all(),
        widget=forms.Select
    )
    hours_worked = forms.DecimalField(label="Hours worked", min_value=0, decimal_places=2)

    class Meta:
        model = Timecard
        fields = ['site_code', 'contractor_name', 'date']

Затем следует реализовать методы clean() и save() в CreateTimeCardForm, чтобы убедиться в достоверности данных и создать ассоциации с другими моделями, сохранив hours_worked.

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