我有一个包含两个表单的页面:SearchForm和QuickAddForm。在Django中处理同一页上的两个表单并不容易,我花了两三天的时间试图让它工作起来。我有几个单元测试,我一直在使用:一个测试为每个窗体,以确保它显示在页面上,一个测试,一个提交一个有效的搜索到searchform返回正确的结果,和三个测试为quickadd形式测试1)提交一个有效的字段结果在一个新的条目保存到数据库;2) 保存条目后,表单重定向到同一页;3)成功消息显示在该页上。例如:
def test_quick_add_form_saves_entry(self):
self.client.post('/editor/', {'quickadd_pre-hw' : 'كلمة'}, follow=True)
self.assertEqual(Entry.objects.count(), 1)
经过大量的工作(并且在这个页面上的答案和评论给了很大的帮助:[Proper way to handle multiple forms on one page in Django)。我终于让表单工作了,所以提交的条目成功地保存在数据库中,并在发布后重定向。耶!你知道吗
除了。。。当我在浏览器中打开页面并尝试输入一个新条目时,很明显它没有这样做。你填好表格然后点击“保存”然后。。。什么都没发生。页面不会重新加载,条目也不会添加到数据库中。但是测试这些特性的测试(如上面的测试)正在通过。(在这一点上,我为成功消息添加了测试,这至少有可能失败。)searchform正在工作。你知道吗
我不知道什么可能会阻止quickadd表单运行。另外,我不明白当表单不起作用时,测试是如何通过的。发生什么事???你知道吗
下面是代码(Python3,Django1.8-为清晰起见稍微简化):
编辑器.html
<form id="id_searchform" role="form" method="POST" action="/editor/">
{% csrf_token %}
{{ searchform.as_p }}
<button type="submit" class="btn btn-primary btn-lg"
name="{{searchform.prefix}}">Search</button>
</form>
...
<h1>New entry</h1>
<form id="id_quick_add_form" method="POST" action='/editor/' class="post-form">
{% csrf_token %}
{{ quickaddform.as_p }}
<button type="submit" class="save btn btn-primary"
name='{{quickaddform.prefix}}'>Save</button>
</form>
视图.py
def _get_form(request, formcls, prefix):
data = request.POST if prefix in next(iter(request.POST.keys())) else None
return formcls(data, prefix=prefix)
def editor_home_page(request):
if request.method == 'POST':
searchform = _get_form(request, SearchForm, 'searchform_pre')
quickaddform = _get_form(request, QuickAddForm, 'quickadd_pre')
if searchform.is_bound and searchform.is_valid():
query = searchform.cleaned_data['searchterm']
results = Entry.objects.filter(bare_hw__icontains=query)
return render(request, 'dict/editor.html', {
'query' : query,
'results' : results,
'searchform' : searchform,
'quickaddform' : quickaddform,
})
elif quickaddform.is_bound and quickaddform.is_valid():
hw = quickaddform.cleaned_data['hw']
e = Entry.objects.create(hw=hw)
messages.success(request, "Entry %s successfully created." % e.hw)
return redirect('/editor/', {
'searchform': SearchForm(prefix='searchform_pre'),
'quickaddform': QuickAddForm(prefix='quickadd_pre'),
})
else:
return render(request, 'dict/editor.html', {
'searchform': SearchForm(prefix='searchform_pre'),
'quickaddform': QuickAddForm(prefix='quickadd_pre')
})
else:
return render(request, 'dict/editor.html', {
'searchform': SearchForm(prefix='searchform_pre'),
'quickaddform': QuickAddForm(prefix='quickadd_pre')
})
表单.py
class SearchForm(Form):
searchterm = forms.CharField(
max_length=100,
widget=forms.TextInput(attrs={
'placeholder': 'English | العربية',
'class' : 'form-control input-lg',
}),
required=True)
class QuickAddForm(Form):
hw = forms.CharField(
max_length=100,
widget=forms.TextInput(attrs={
'placeholder': 'ex: مَضْروب',
'class' : 'form-control',
}),
required=True)
目前没有回答
相关问题 更多 >
编程相关推荐