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

#python #django #django-models #django-forms #django-templates

Вопрос:

например, у меня есть 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
    )
 

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

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

Ответ №1:

Аналогично тому, что вы сделали с 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 .