Jul*_*an 4 python forms django django-forms
我正在尝试使用表单集为一组与日期相关的时间范围创建表单:
class Event(models.Model):
date = models.DateField()
class TimeFrame(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
event = models.ForeignKey('Event')
Run Code Online (Sandbox Code Playgroud)
我有代码可以获取每个事件的时间范围查询集,并添加一个 kwarg 将其传递到我的表单中:
class SelectDatesForm(forms.Form):
timeframes = forms.ModelChoiceField(queryset=HostTimeFrame.objects.none())
def __init__(self, *args, **kwargs):
qs = kwargs.pop('timeframes')
super(SelectDatesForm, self).__init__(*args, **kwargs)
self.fields['timeframes'].queryset = qs
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试构建一个表单集,让我可以在一页上显示多个事件的时间范围。我已经找到了这个问题,解释了如何为多种表单传递初始数据,但它与将其传递给查询集不同。
django 1.9 中还有这个新函数,但它不允许我为每个表单获取不同的查询集。
更新:我从答案中得到了解决方案,但是,每当我运行 formset.is_valid() 时,我都会收到错误:
选择一个有效的选择。该选择不是可用的选择之一。
我认为这是我所做的:
timeframes = [HostTimeFrame.objects.all()]
SelectDatesFormset = formset_factory(form=SelectDatesForm, extra=len(timeframes), formset=BaseSelectDatesFormSet)
if request.method == 'POST':
formset = SelectDatesFormset(request.POST, form_kwargs={'timeframes_list': timeframes})
if formset.is_valid():
# do something with the formset.cleaned_data
print(formset)
pass
else:
formset = SelectDatesFormset(form_kwargs={'timeframes_list': timeframes})
Run Code Online (Sandbox Code Playgroud)
我花了几个小时试图找到实际验证的位置,但我无法找到它。
编辑:我用单数形式测试了这个,我有同样的问题,我在这里为此创建了一个新问题。
Jul*_*an 6
更新:仅部分解决方案,请参阅问题。
我自己解决了:
首先我创建了一个 BaseFormSet:
class BaseSelectDatesFormSet(BaseFormSet):
def get_form_kwargs(self, index):
kwargs = super(BaseSelectDatesFormSet, self).get_form_kwargs(index)
kwargs['timeframes'] = kwargs['timeframes_list'][index]
return kwargs
Run Code Online (Sandbox Code Playgroud)
然后我可以在视图中传递时间范围列表:
SelectDatesFormset = formset_factory(form=SelectDatesForm, extra=4, formset=BaseSelectDatesFormSet)
formset = SelectDatesFormset(form_kwargs={'timeframes_list': timeframes})
Run Code Online (Sandbox Code Playgroud)
最后我必须更新我的表单init来弹出列表,这样超级构造函数就不会抱怨不需要的 kwargs:
def __init__(self, *args, **kwargs):
qs = kwargs.pop('timeframes')
qs_list = kwargs.pop('timeframes_list')
super(SelectDatesForm, self).__init__(*args, **kwargs)
self.fields['timeframes'].queryset = qs.order_by('start')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1801 次 |
| 最近记录: |