ฟอร์มเซ็ตอินไลน์ของ Django ไม่ได้ทำเช่นนี้

ฉันกำลังสร้างเว็บไซต์บันทึกแคลอรี่โดยใช้ Django หนึ่งสร้างบัญชีและสามารถเริ่มบันทึกปริมาณแคลอรี่ที่เขาบริโภคและเผาผลาญในวันที่กำหนด จากนั้นจะแสดงว่าในวันนั้นเขาบริโภคหรือเผาผลาญแคลอรีมากขึ้น
ผู้ใช้สามารถเก็บอาหารที่กินบ่อยและออกกำลังกายบ่อยครั้งที่ เขาทำอย่างนั้นเมื่อเขาเพิ่มข้อมูล เขาสามารถใช้รายการนั้นได้
การใช้ midels ที่ผู้ใช้กำหนดสามารถเพิ่มรายการอาหารและแบบฝึกหัดได้
โมเดลอาหาร:

class Food(models.Model):
    customer = models.ForeignKey(Customer, null=True, on_delete=models.CASCADE)
    food_name = models.CharField(max_length=50, null=True, blank=True)
    calories = models.IntegerField(null=True)
    food_pic = models.ImageField(default="default_food.jpg", null=True, blank=True)

def __str__(self):
    return f"{self.food_name}"

รูปแบบการออกกำลังกาย:

class Exercise(models.Model):
    customer = models.ForeignKey(Customer, null=True, on_delete=models.CASCADE)
    exercise_name = models.CharField(max_length=100, null=True, blank=True)
    calories = models.IntegerField(null=True)
    exercise_pic = models.ImageField(default="default_exercise.png", null=True, blank=True)

def __str__(self):
    return f"{self.exercise_name}"

ฉันใช้สองโมเดลต่อไปนี้เพื่อจัดเก็บข้อมูลเกี่ยวกับวันที่ที่ระบุ:
DailyFood Model:

class DailyFood(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True)
    food_name = models.ForeignKey(Food, on_delete=models.CASCADE, null=True)
    quantity = models.FloatField(null=True)
    date = models.DateField(auto_now_add=True, null=True)

def __str__(self):
     return f"{self.customer}, {self.date}"

โมเดลการออกกำลังกายรายวัน:

class DailyExercise(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True)
    exercise_name = models.ForeignKey(Exercise, on_delete=models.CASCADE, null=True)
    quantity = models.FloatField(null=True)  # number of hours done exercise
    date = models.DateField(auto_now_add=True, null=True)

def __str__(self):
     return f"{self.customer}, {self.date}"

ในไฟล์ views.py

def addData(request):
customer = request.user.customer
food_formset = inlineformset_factory(Customer, DailyFood, fields=('food_name', 'quantity', ))
exercise_formset = inlineformset_factory(Customer, DailyExercise, fields=('exercise_name', 'quantity', ))

f_formset = food_formset(instance=customer)
e_formset = exercise_formset(instance=customer)

if request.method == "POST":
    f_formset = food_formset(request.POST, instance=customer)
    e_formset = exercise_formset(request.POST, instance=customer)
    
    if f_formset.is_valid():
        mf_formset = f_formset.save(commit=False)
        mf_formset.customer = customer
        mf_formset.save()
    else:
        return HttpResponse("reached food_formset is not valid")

    if e_formset.is_valid():
        me_formset = e_formset.save(commit=False)
        me_formset.customer = customer
        me_formset.save()
        return redirect('/')
    else:
        return HttpResponse("reached exercise_formset is not valid")
else:
    foods = Food.objects.filter(customer=customer)
    exercises = Exercise.objects.filter(customer=customer)


    context = {'foods': foods, 'exercises': exercises, 'f_formset': f_formset, 'e_formset': e_formset}
    return render(request, 'cc/add-data.html', context)

AddData html (ส่วนของแบบฟอร์ม):

<form action="" method="POST">
      {% csrf_token %}
      <div class="foods">
          <p class="ad-accordion">Calories Consumed</p>
          <div class="ad-accordion-content">
            {% for form in f_formset %}
                {{form}}
                <br>
              {% endfor %}
          </div>
      </div>
      <div class="exercises">
        <p class="ad-accordion">Calories Burnt</p>
          <div class="ad-accordion-content">
              {% for form in e_formset %}
                {{form}}
                <br>
              {% endfor %}
          </div>
      </div>
      <p class="center-button">
          <button type="submit">Submit</button>
        </p>
    </form>

Q) When submitting the form, the form is invalid, when I print the f_formset and e_formset I get:

  • (ฟิลด์ที่ซ่อนอยู่ TOTAL_FORMS) ฟิลด์นี้จำเป็นต้องระบุ
  • (ช่องที่ซ่อน INITIAL_FORMS) ช่องนี้จำเป็น
  • input type="hidden" name="dailyfood_set-TOTAL_FORMS" id="id_dailyfood_set-TOTAL_FORMS"
    input type="hidden" name="dailyfood_set-INITIAL_FORMS" id="id_dailyfood_set-INITIAL_FORMS"
    input type="hidden" name="dailyfood_set-MIN_NUM_FORMS" id="id_dailyfood_set-MIN_NUM_FORMS"
    input type="hidden" name="dailyfood_set-MAX_NUM_FORMS" id="id_dailyfood_set-MAX_NUM_FORMS"

    เหตุใดค่าเหล่านี้จึงไม่อยู่ที่นั่น ฉันใช้ inlineformset ในโครงการอื่นและค่าเหล่านี้ถูกป้อนอัตโนมัติโดย django แต่ด้วยเหตุผลบางอย่างจึงไม่เกิดขึ้นกับค่าใดค่าหนึ่ง ??


    person Ujjwal Saxena    schedule 23.04.2021    source แหล่งที่มา


    คำตอบ (1)


    เมื่อคุณสร้างการแสดงผล formset ด้วยตนเอง คุณต้องรวม ManagementForm เข้ากับแท็ก {{ your_formset.management_form }} แบบฟอร์มนี้ถูกใช้โดยชุดแบบฟอร์มเพื่อจัดการคอลเลกชันของแบบฟอร์มที่มีอยู่ในชุดแบบฟอร์ม ดูเอกสารประกอบที่นี่ และที่นี่

    <form action="" method="POST">
          {% csrf_token %}
          <div class="foods">
              <p class="ad-accordion">Calories Consumed</p>
              <div class="ad-accordion-content">
                {{ f_formset.management_form }}
                {% for form in f_formset %}
                    {{form}}
                    <br>
                  {% endfor %}
              </div>
          </div>
          <div class="exercises">
            <p class="ad-accordion">Calories Burnt</p>
              <div class="ad-accordion-content">
                  {{ e_formset.management_form }}
                  {% for form in e_formset %}
                    {{form}}
                    <br>
                  {% endfor %}
              </div>
          </div>
          <p class="center-button">
              <button type="submit">Submit</button>
            </p>
        </form>
    
    person yagus    schedule 23.04.2021