回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在我的Django项目中使用了基于TDD的方法,这是一个自制材料数据库。我已经能够通过函数和单元测试来添加hops记录。我遇到的问题是updateview函数(编辑现有记录)。我以前在基于类的视图中做过这样的操作,遇到了一些我无法避免的错误,这就是为什么我使用TDD/函数视图方法而不是直接使用CBV方法</p>
<p>我当前收到以下错误,表明我的视图<code>beerdb/edit/(?P<pk>\\d+)/hops/$</code>没有反向匹配。所以我在Hop模型上创建了一个get_absolute_url方法:</p>
<pre><code>def get_absolute_url(self):
return reverse('updatehops', kwargs={'pk': self.id})
</code></pre>
<p>要返回反向url:</p>
^{pr2}$
<p>这是我的测试,结果是上面的错误:</p>
<pre><code> def test_can_update_hops(self):
self.client.post(
'/beerdb/add/hops/',
data={
'name': 'Warrior',
'min_alpha_acid': 24.00,
'max_alpha_acid': 32.00,
'country': 'USA',
'comments': 'Very bitter, not good for aroma'
})
hop_instance = Hop.objects.filter(name='Warrior')[0]
response = self.client.get('/beerdb/edit/%d/hops/' % hop_instance.id)
self.assertEqual(response.status_code, 200)
</code></pre>
<p>我的其他项目详情如下。有人能指出我可能出了什么问题吗?我也认为网址.py可能需要修改一下。我不太明白如何用模板返回反向的url。我查看了render、render-to-_响应、redirect和HttpResponseRedirect对象,但是我不知道如何返回上下文。在基于类的视图中,我会调用super方法并获取上下文数据,将主键添加到“action”,但我不知道如何在这里应用它。在</p>
<p><strong>项目详情</strong></p>
<p>在网址.py在</p>
<pre><code>urlpatterns = [
url(r'^$', views.homebrewmain, name='beerdb_main'),
url(r'^hops/$', views.hops, name='hops_list'),
url(r'^add/hops/$', views.addhops, name='addhops'),
url(r'^edit/(?P<pk>\d+)/hops/$', views.updatehops, name='updatehops')
]
</code></pre>
<p>在模型.py在</p>
<pre><code>class Hop(models.Model):
name = models.CharField(max_length=200, default='')
min_alpha_acid = models.DecimalField(max_digits=4, decimal_places=2)
max_alpha_acid = models.DecimalField(max_digits=4, decimal_places=2)
# Country codes for origin (as defined by http://countrycode.org)
AUSTRALIA = 'AUS'
CANADA = 'CAN'
CHINA = 'CHN'
CZECH_REPUBLIC = 'CZE'
FRANCE = 'FRA'
GERMANY = 'DEU'
NEW_ZEALAND = 'NZL'
POLAND = 'POL'
UNITED_KINGDOM = 'GBR'
UNITED_STATES = 'USA'
COUNTRY_CODES = (
(AUSTRALIA, 'Australia'),
(CANADA, 'Canada'),
(CHINA, 'China'),
(CZECH_REPUBLIC, 'Czech Republic'),
(FRANCE, 'France'),
(GERMANY, 'Germany'),
(NEW_ZEALAND, 'New Zealand'),
(POLAND, 'Poland'),
(UNITED_KINGDOM, 'United Kingdom'),
(UNITED_STATES, 'United States'),
)
country = models.CharField(max_length=3,
choices=COUNTRY_CODES,
default=UNITED_STATES
)
comments = models.TextField(default='')
def get_absolute_url(self):
return reverse('updatehops', kwargs={'pk': self.id})
</code></pre>
<p><strong>编辑:</strong>我更新了我的view函数,以返回反向url的重定向,而不使用点表示法:</p>
<pre><code>def updatehops(request, pk):
hop_record = Hop.objects.filter(pk=pk)[0]
edit_form = HopForm(request.POST or None, instance=hop_record)
if request.method == 'POST':
if edit_form.is_valid():
edit_form.save()
success_url = reverse('hops_list')
return HttpResponseRedirect(success_url)
hop_form_url = reverse('updatehops', kwargs={'pk': hop_record.id})
return redirect(hop_form_url)
</code></pre>
<p>正如我在下面的评论中所指出的,如果我在response=302上断言status_code,那么测试就通过了,但是我需要200来确保我得到了呈现的表单,这样我就可以访问响应中的内容,更改一些数据,并在以后编写其余测试时重新保存。在</p>
<p><strong>更新:</strong>在做了一些研究之后,我修改了url,使其现在传入hop_id而不是<code><pk></code>:</p>
<pre><code>url(r'^edit/(?P<pk>\d+)/hops/$', views.updatehops, name='updatehops'),
</code></pre>
<p>我仍然得到错误,但它收到了错误消息中的pk:</p>
<pre><code>django.core.urlresolvers.NoReverseMatch: Reverse for 'updatehops' with arguments '()' and keyword arguments '{'pk': 7}' not found. 1 pattern(s) tried: ['beerdb/edit/(?P<hop_id>\\d+)/hops/$']
</code></pre>
<p><strong>编辑2:我已将“pk”添加回URL,添加回溯</strong></p>
<p><em>回溯</em></p>
<pre><code>Template error:
In template /Path/To/Site/Site/homebrewdatabase/templates/homebrewdatabase/hops.html, error at line 23
Reverse for 'updatehops' with arguments '()' and keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['beerdb/edit/(?P<pk>\\d+)/hops/$']
13 : {% include 'homebrewdatabase/addhops.html' %}
14 :
15 : <!--Modal data begins here to edit hops-->
16 : <div class="modal fade" id="updatehops" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
17 : <div class="modal-dialog" role="document">
18 : <div class="modal-content">
19 : <div class="modal-header">
20 : <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
21 : <h4 class="modal-title" id="myModalLabel">Add Hops</h4>
22 : </div>
23 : <form action=" {% url 'homebrewdatabase:updatehops' pk=hop.id %} " method="POST">
24 : <div class="modal-body">
25 : {{ form.as_p }}
26 : {% csrf_token %}
27 : </div>
28 : <div class="modal-footer">
29 : <button type="button" id="close" class="btn btn-default" data-dismiss="modal">Close</button>
30 : <button type="submit" id="submit" class="btn btn-primary">Submit</button>
31 : </form>
32 : </div>
33 : </div>
</code></pre>
<p><strong>编辑3:</strong><a href="http://pastebin.com/ksKQzbnM" rel="nofollow">views.py</a>和<a href="http://pastebin.com/vRJSFA2f" rel="nofollow">hops.html</a></p>