gpt4 book ai didi

Django:使用实例初始化自定义表单的 FormSet

转载 作者:行者123 更新时间:2023-12-03 05:04:06 25 4
gpt4 key购买 nike

给定以下模型:

class Graph(models.Model):
owner = models.ForeignKey(User)

def __unicode__(self):
return u'%d' % self.id

class Point(models.Model):
graph = models.ForeignKey(Graph)
date = models.DateField(primary_key = True)
abs = models.FloatField(null = True)
avg = models.FloatField(null = True)

def __unicode__(self):
return u'%s' % self.date

我正在尝试创建一个用于编辑点列表的表单。HTML 输入标记需要设置其他属性,因此我使用以下自定义表单:

class PointForm(forms.ModelForm):
graph = forms.ModelChoiceField(queryset = Graph.objects.all(),
widget = forms.HiddenInput())
date = forms.DateField(widget = forms.HiddenInput(), label = 'date')
abs = forms.FloatField(widget = forms.TextInput(
attrs = {'class': 'abs-field'}),
required = False)

class Meta:
model = Point
fields = ('graph', 'date', 'abs') # Other fields are not edited.

def pretty_date(self):
return self.data.strftime('%B')

此时我不知道如何将 Point 类的实例传递给 FormSet:

def edit(request):
PointFormSet = forms.formsets.formset_factory(PointForm, extra = 0)
if request.method == 'POST':
return

# Receive 3 points to edit from the database.
graph, res = Graph.objects.get_or_create(id = 1)
one_day = datetime.timedelta(days = 1)
today = datetime.date.today()
do_edit = []
for date in [today - (x * one_day) for x in range(3)]:
point, res = Point.objects.get_or_create(graph = graph, date = date)
do_edit.append(point)

formset = PointFormSet(????) # How is this initialized with the points?

我发现了一种可行的方法,但在稍后尝试处理生成的 POST 数据时会导致错误:

do_edit = []
for date in [today - (x * one_day) for x in range(3)]:
point, res = Point.objects.get_or_create(graph = graph, date = date)
data = point.__dict__.copy()
data['graph'] = graph
do_edit.append(data)

formset = PointFormSet(initial = do_edit)

如何正确完成此操作?

作为引用,我的模板如下所示:

<form action="" method="post">
{{ formset.management_form }}
<table>
<tbody>
{% for form in formset.forms %}
<tr>
<td>{{ form.graph }} {{ form.date }} {{ form.pretty_date }}:</td>
<td width="100%">{{ form.abs }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</form>

最佳答案

诀窍是使用“ModelFormset”而不仅仅是表单集,因为它们允许使用查询集进行初始化。文档是here ,您要做的就是在创建模型表单集时提供 form=* ,在实例化表单集时提供 queryset=* 。 form=* 争论没有得到很好的记录(必须在代码中进行一些挖掘以确保它确实存在)。

def edit(request):
PointFormSet = modelformset_factory(Point, form = PointForm)
qset = Point.objects.all() #or however your getting your Points to modify
formset = PointFormset(queryset = qset)
if request.method == 'POST':
#deal with posting the data
formset = PointFormset(request.POST)
if formset.is_valid():
#if it is not valid then the "errors" will fall through and be returned
formset.save()
return #to your redirect

context_dict = {'formset':formset,
#other context info
}

return render_to_response('your_template.html', context_dict)

所以代码很容易完成。如果请求是 GET,则实例化的表单将返回给用户。如果请求是POST且表单为not .is_valid()然后错误“失败”并在同一模板中返回。如果请求是 POST 并且数据有效,则保存表单集。

希望有帮助。

-将

关于Django:使用实例初始化自定义表单的 FormSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1992152/

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