Django modelformset_factory: как создать поле с постоянным значением

Допустим, у меня есть пекарня, которая выпекает 10 пирогов в партии (т.е. все 10 пирогов попадают в одну печь). Задача состоит в том, чтобы просто записать вес (в граммах) и стоимость каждого пирога (в $). Стоимость = вес * 0.01.

Итак, каждый пирог моделируется как объект PieRecord, который имеет вес и стоимость:

models.py

from django.db import models

class PieRecord(models.Model):
    """this will be in a modelformset
    """
    # pie_name is a dummy field just to play with text input
    pie_name = models.CharField(max_length=20) 
    pie_weight_grams = models.FloatField()

    # calculated: cost($) = pie_weight_grams * 0.01
    cost = models.FloatField(default=0.0)

Я использую modelformset_factory для генерации 10 PieRecord форм за раз, и выводимых на веб-страницу (см. views.py ниже). Мой вопрос: я хотел бы прикрепить некоторые поля, которые специфичны для каждой партии из 10 пирогов (не для каждого пирога), например:

  • время приготовления (минуты, FloatField)
  • название блюда (CharField)
  • дата приготовления (DateField)
  • температура приготовления (градС, FloatField)

Если я просто добавлю эти поля в класс PieRecord, это приведет к тому, что пользователю придется вводить одни и те же значения 10 раз (например, cook_name James baked this batch of 10 pies), что приведет к гораздо большему количеству ввода данных, чем нужно; пользователю нужно заполнить эти поля только один раз для всей партии. Есть ли более элегантный способ сделать это так, чтобы пользователю нужно было ввести эти значения только один раз?

views.py

from django.shortcuts import render
from django.forms import modelformset_factory
from .models import PieRecord

def register_pies(request):
    pie_formset = modelformset_factory(
        PieRecord,
        fields = (
            "pie_name", 
            "pie_weight_grams"
            ),
        extra=10
    )

    if request.method == "POST":
        formset = pie_formset(request.POST)

        if formset.is_valid():
            print("form is valid")
            for f in formset:
                pie_name = f.cleaned_data.get("pie_name")
                pie_weight_grams = f.cleaned_data.get("pie_weight_grams")
                cost = pie_weight_grams * 0.01

                new_pie_record = PieRecord(
                    pie_name=pie_name, 
                    pie_weight_grams=pie_weight_grams,
                    cost=cost
                )

                new_pie_record.save()

    form = pie_formset(queryset=PieRecord.objects.none())

    return render(request, "pies/index.html", {"form":form})

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="">
    </head>
    <body>
        <form method="POST">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit">
        </form>
    </body>
</html>

Попытки: создал отдельный объект BatchRecord и попытался связать его с объектом PieRecord с помощью models.ForeignKey(...), но это приводит к запутанному рабочему процессу, поскольку объект BatchRecord должен быть создан сначала прежде чем может быть создан связанный с ним PieRecords, чтобы ссылке ForeignKey было на что указывать. Это приводит к двухэтапному вводу данных пользователем, что не кажется необходимым.

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