簡體   English   中英

Django 內聯表單集不這樣做

[英]Django inline formset does not do this

我正在使用 Django 創建卡路里日志網站。 一個人創建一個帳戶,可以開始記錄他在特定日期消耗和燃燒的卡路里量,然后它會顯示他在那天消耗或燃燒了更多卡路里。
用戶可以存儲他經常吃的食物和經常做的運動,這樣當他添加數據時,他可以使用該項目
使用給定的 midels 用戶可以添加食物和練習。
食品 Model:

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}"

練習 Model:

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}"

每日練習 Model:

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) 提交表單時,表單無效,當我打印 f_formset 和 e_formset 時,我得到:

  • (隱藏字段 TOTAL_FORMS)此字段是必需的。
  • (隱藏字段 INITIAL_FORMS)此字段是必需的。
  • 輸入類型="隱藏" 名稱="dailyfood_set-TOTAL_FORMS" id="id_dailyfood_set-TOTAL_FORMS"
    輸入類型="隱藏" 名稱="dailyfood_set-INITIAL_FORMS" id="id_dailyfood_set-INITIAL_FORMS"
    輸入類型="隱藏" 名稱="dailyfood_set-MIN_NUM_FORMS" id="id_dailyfood_set-MIN_NUM_FORMS"
    輸入類型="隱藏" 名稱="dailyfood_set-MAX_NUM_FORMS" id="id_dailyfood_set-MAX_NUM_FORMS"

    為什么這些值不存在,我在另一個項目中使用了 inlineformset,這些值是由 django 自動填充的,但由於某種原因,它不會發生在一個項目中?

    當您手動呈現表單集時,您需要包含帶有標簽{{ your_formset.management_form }}的 ManagementForm。 這個表單被表單集用來管理包含在表單集中的 forms 的集合。 請參閱此處此處的文檔。

    <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>
    

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM