[英]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.