gpt4 book ai didi

用于多对多模型的 Django 表单。如何从 View /模板中填写表格?

转载 作者:行者123 更新时间:2023-12-04 13:49:54 24 4
gpt4 key购买 nike

所以我有 2 个模型,它们通过多对多 关系关联。因为我需要一个额外的文件,所以我使用了额外的模型 CategoryByDay

基本上,我想要在我的应用程序中创建一个习惯或日常 list ,记录我今天必须做的各种事情。所以我想将每个新的一天与每个类别联系起来并记录它的状态(如果完成了 1,如果没有完成 0)。我正在使用 CharField,因为稍后我想记录其他内容,如书籍阅读等,这里不相关

模型.py

from django.db import models

class Day(models.Model):
name = models.CharField(max_length=8)
date = models.DateField()

def __unicode__(self):
return self.name

class Category(models.Model):
name = models.CharField(max_length=100)
categoryBD = models.ManyToManyField(Day, through='CategoryByDay')

def __unicode__(self):
return self.name

class CategoryByDay(models.Model):
day = models.ForeignKey(Day)
category = models.ForeignKey(Category)
status = models.CharField(max_length=64)

在我的 html 中,我想显示一个类别列表和它附近的一个表单,其中将只发布状态和日期以及类别将自动填写。现在我不知道该怎么做。这是我到目前为止所得到的,在一些论坛上阅读你可以从 View 中传递额外数据(这不起作用,并且表格要求我填写日期和类别表格)

View .py

def today(request):
if request.method == 'POST':
#... POST validation here, not relevant
else:
day = datetime.date.today().strftime("%d/%m/%y")
categories_list = Category.objects.all()
category_form_list = []
# I am doing this strange list, because later in template I had problem
# accessing list through iteration like forloop.counter.
# I will access it via for x,y in pair
for category in categories_list:
data = {'day': day,
'category': category.name,}
form = CategoryByDayForm(data)
#So I tried adding data to form, it didn't work and can be ignored
part = [category, form]
category_form_list.append(part)
context = { 't': t,
'category_form_list': category_form_list,}
return render(request, 'today/today.html', context)

这是我的表格,我想应该早点添加它。

形成 py

class CategoryByDayForm(forms.ModelForm):
status = forms.CharField(max_length=64, initial="0")
day = forms.ModelMultipleChoiceField(queryset=Day.objects.all())
category = forms.ModelMultipleChoiceField(queryset=Category.objects.all())
class Meta:
model = CategoryByDay

现在,在表单中我不确定我应该为日期和类别使用什么表单类型。也许我应该以某种方式忽略它?

最终模板:

今天html

#...
<ul>
{% for category, form in category_form_list %}
<li>
{{ category.name }}
<form action="" method="post">
{% csrf_token %}
{{ form.non_field_errors}}
<div class="status">
{{ form.status.errors}}
{{ form.status }}
<input type="submit" value="Submit" />
</div>
</form>
</li>
{% endfor %}
</ul>
#...

这是有效的,只显示一个表单 status 但是当我点击提交并以我的方式调试它时,我有错误,我没有填写日期和类别表单。

有人可以告诉我如何进行吗?

最佳答案

我设法让它发挥作用。

对于任何人在未来偶然谷歌搜索并进入此页面是我所做的。

1.更改了 CategoryByDayForm 的形式,使其仅接受状态并排除日期和类别

表格.py

from django import forms
from today.models import CategoryByDay, Category, Day

class CategoryByDayForm(forms.ModelForm):
status = forms.CharField(max_length=64, initial="0")
class Meta:
model = CategoryByDay
exclude = ['day', 'category']
  1. 在模板中,添加了发送当前类别迭代的隐藏表单输入:

今天.html

#...
{% for category, form in category_form_list %}
<li>
{{ category.name }}
<form action="" method="post">
{% csrf_token %}
{{ form.non_field_errors}}
<input type="hidden" value="{{ category.name }}" name="category">
<div class="status">
{{ form.status }}
<input type="submit" value="Submit" />
</div>
</form>
</li>
{% endfor %}
# ...

最后,在 View 中,我操纵了我得到的表单,所以我添加了缺少的元素(从表单我有状态,我仍然需要设置日期和类别)

View .py

def today(request):
t = datetime.date.today().strftime("%d/%m/%y")
day = Day.objects.filter(name=t)
if request.method == 'POST':
form = CategoryByDayForm(request.POST)
if form.is_valid():
category_status = form.save(commit=False)
category_status.day = day[0]
category_name = request.POST['category']
category_status.category = Category.objects.filter(name=category_name)[0]
category_status.save()
form.save_m2m()

...

希望对以后的人有所帮助。

关于用于多对多模型的 Django 表单。如何从 View /模板中填写表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com