Django: 查看测试通过,但表单在页面中无效?

2024-09-28 15:32:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两个表单的页面: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)

Tags: form表单prefixrequest条目页面preeditor