我希望对Django有更多了解的人能说出可能发生的事情,因为我觉得我已经检查了所有内容并且无法理解它。
我有一个简单的视图,它可以很好地工作,根据网址中的唯一字符串检索条目:
# urls.py
urlpatterns = patterns('',
# ...
# url(r'^bib/(?P<unique_str>\w+-\w+-\d+)/(?P<slug>[\w\d-]+)$', 'nl.views.text_detail', name='text_detail'),
# ...
)
# views.py
import myapp.models
import django.shortcuts
def text_detail(request, unique_str, slug):
entry= django.shortcuts.get_object_or_404(myapp.models.Entry, unique_str=unique_str)
return django.shortcuts.render(request, 'mytemplate.html', {'entry': entry,})
但是,当我在具有完全相同参数的另一个视图中调用完全相同的函数时,它会引发Http404
。 (当我运行Entry.objects.get(unique_str=unique_str)
方法时,它会引发模型的DoesNotExist
异常。)
该视图是一个AJAX视图,可以使用简单的URL访问,并接受包含URL的已发布JSON数据。根据传递的URL,我想检索相关的Entry并对其进行一些处理。
给定一个可以在浏览器中很好地显示text_detail视图的url,下面的视图在get_object_or_404()上失败:
# urls.py
urlpatterns = patterns('',
# ...
# url(r'^sendurl/$', 'nl.views.sendurl', name='sendurl'),
# ...
)
# views.py
import json
from django.core.urlresolvers import resolve
import django.shortcuts
import myapp.models
def sendurl(request):
if request.is_ajax():
data = json.loads(request.POST['jsonData'])
url = data['url']
resolvermatch = resolve(url)
if resolvermatch.view_name == 'text_detail':
unique_str = resolvermatch.kwargs['unique_str']
slug = resolvermatch.kwargs['slug']
# When I put these lines, it actually prints out the HTML of the text_detail view:
# response = nl.views.text_detail(request, unique_str, slug)
# print response
# But this fails:
entry = django.shortcuts.get_object_or_404(myapp.models.Entry, unique_str=unique_str)
# Do Entry processing
# entry.save()
else ... :
# ...
else:
raise Http404
这怎么可能?
我正在使用Django 1.6和SQLite数据库(正在开发中)。
提前多多感谢!