多表合一视图:如何处理字段错误?
Multiple form into one view: how to handle a field error?
我有这样一个模型:
class PersonneTravel(models.Model):
personne = models.ForeignKey(Personne, verbose_name=_(u'Person'))
travel = models.TextField(null=True, blank=True, verbose_name=_(u'Travel'))
date_start = models.DateTimeField(default=None, null=True, blank=True,
editable=True, verbose_name=_(u"Start"))
date_end = models.DateTimeField(default=None, null=True, blank=True,
editable=True, verbose_name=_(u"End"))
comments = models.TextField(null=True, blank=True,
verbose_name=_(u'Comments'))
我显示一个人所有旅行的列表。
我想做的是让在线编辑任何旅行的可能性,或者添加一个到一个视图。
这是我的做法:
- 创建一个表单:
class PersonneTravelForm
包含所有字段
- 创建一个视图
class IndexView(LoginRequiredMixin, generic.FormView):
重载 get_context_data
我在其中创建所有这些表单,如下所示:
def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
context['travels'] = []
for ptf in PersonneTravel.objects.filter(
personne__user=self.request.user,
):
context['travels'].append({
'obj': ptf,
'form': PersonneTravelForm({
'pk': ptf.pk,
'travel': ptf.travel.value,
'date_start': ptf.date_start,
'date_end': ptf.date_end,
'comments': ptf.comments,
})
})
在模板中,我做了一个循环:
{% for v in travels %}
{% with v.form as form %}
{% include "my_home/travels/travel_form.html" %}
{% endwith %}{# form #}
{% endfor %}
并在文件 travel_form.html
中显示表格
- 我为每个表单添加了一些带有按钮 "edit" 的 javascript,我们用户点击它,我
slideDown()
表单
- 当用户点击“
update
”更新一个游记时,相应的表格将作为POST
发送。在表单代码中,我以 def clean_XXXX(self):
的形式创建了所有过滤器,所有字段都正确 "cleaned"
- 在视图中,我分析了
def form_valid(self, form)
中的字段:
- 如果字段中有
pk
,则它用于更新或删除
- 如果所有其他字段都是None我删除
- 如果任何字段不是 None 那么我更新
- 如果没有
pk
是为了添加一条新记录,我添加一条
我最大且唯一的问题是出现错误时:如果我在检查表格时尝试添加错误,并且出现问题,我会这样做,例如:
def form_valid(self, form):
fc = form.cleaned_data
d_start = fc['date_start']
d_end = fc['date_end']
comments = fc.get('comments', None)
if d_end and d_start:
if d_end > datetime.datetime.now().date() > d_start:
form.add_error('date_start', _(u"Can't start in the past..."))
form.add_error('date_end', _(u"...and end in the future!"))
return super(IndexView, self).form_invalid(form)
一切似乎都很好...除了错误字段 总是 进入 "add new" 空白表格,永远不会进入良好的 "edit" 表格。你会如何处理?
当您处理相同类型的表单列表时,为此需要 Django Formsets。 Formset 为您提供了创建新记录以及删除和更新旧记录的内置功能。
我有这样一个模型:
class PersonneTravel(models.Model):
personne = models.ForeignKey(Personne, verbose_name=_(u'Person'))
travel = models.TextField(null=True, blank=True, verbose_name=_(u'Travel'))
date_start = models.DateTimeField(default=None, null=True, blank=True,
editable=True, verbose_name=_(u"Start"))
date_end = models.DateTimeField(default=None, null=True, blank=True,
editable=True, verbose_name=_(u"End"))
comments = models.TextField(null=True, blank=True,
verbose_name=_(u'Comments'))
我显示一个人所有旅行的列表。 我想做的是让在线编辑任何旅行的可能性,或者添加一个到一个视图。
这是我的做法:
- 创建一个表单:
class PersonneTravelForm
包含所有字段 - 创建一个视图
class IndexView(LoginRequiredMixin, generic.FormView):
重载
get_context_data
我在其中创建所有这些表单,如下所示:def get_context_data(self, **kwargs): context = super(IndexView, self).get_context_data(**kwargs) context['travels'] = [] for ptf in PersonneTravel.objects.filter( personne__user=self.request.user, ): context['travels'].append({ 'obj': ptf, 'form': PersonneTravelForm({ 'pk': ptf.pk, 'travel': ptf.travel.value, 'date_start': ptf.date_start, 'date_end': ptf.date_end, 'comments': ptf.comments, }) })
在模板中,我做了一个循环:
{% for v in travels %} {% with v.form as form %} {% include "my_home/travels/travel_form.html" %} {% endwith %}{# form #} {% endfor %}
并在文件
travel_form.html
中显示表格- 我为每个表单添加了一些带有按钮 "edit" 的 javascript,我们用户点击它,我
slideDown()
表单 - 当用户点击“
update
”更新一个游记时,相应的表格将作为POST
发送。在表单代码中,我以def clean_XXXX(self):
的形式创建了所有过滤器,所有字段都正确 "cleaned" - 在视图中,我分析了
def form_valid(self, form)
中的字段:- 如果字段中有
pk
,则它用于更新或删除- 如果所有其他字段都是None我删除
- 如果任何字段不是 None 那么我更新
- 如果没有
pk
是为了添加一条新记录,我添加一条
- 如果字段中有
我最大且唯一的问题是出现错误时:如果我在检查表格时尝试添加错误,并且出现问题,我会这样做,例如:
def form_valid(self, form):
fc = form.cleaned_data
d_start = fc['date_start']
d_end = fc['date_end']
comments = fc.get('comments', None)
if d_end and d_start:
if d_end > datetime.datetime.now().date() > d_start:
form.add_error('date_start', _(u"Can't start in the past..."))
form.add_error('date_end', _(u"...and end in the future!"))
return super(IndexView, self).form_invalid(form)
一切似乎都很好...除了错误字段 总是 进入 "add new" 空白表格,永远不会进入良好的 "edit" 表格。你会如何处理?
当您处理相同类型的表单列表时,为此需要 Django Formsets。 Formset 为您提供了创建新记录以及删除和更新旧记录的内置功能。