这可能是一个重复的问题,但我在SO上找不到任何答案。 我正在尝试编写一种能够采用两种不同模型的方法。我有一个Post模型和一个Comment模型,我希望vote_up方法能够处理这两个模型的投票。
views.py
def vote_up(request, obj): #portotype not working atm...
if isinstance(obj, Post):
o = Post.objects.get(id=obj.id)
elif isinstance(obj, Comment):
o = Comment.objects.get(id=obj.id)
else:
return HttpResponseRedirect(request.META.get('HTTP_REFERER')) #add 'something went wrong' message
o.votes += 1
o.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
urls.py
urlpatterns = patterns('',
url(r'^vote_up/(?P<obj>\d+)/$', 'post.views.vote_up'),
url(r'^post_vote_down/(?P<post_id>\d+)/$', 'post.views.post_vote_down'), # works fine no instance check here, using separate methods for Post/Comment
url(r'^comment_vote_down/(?P<comment_id>\d+)/$', 'post.views.comment_vote_down'),
)
我得到的错误是列出我现有的网址和: 当前URL,post / vote_up / Post对象与其中任何一个都不匹配。 要么 当前URL,post / vote_up / Comment对象与其中任何一个都不匹配。
我猜是\ d +是恶棍,但似乎无法找到正确的语法。
答案 0 :(得分:4)
正如Burhan所说,你不能在URL中发送对象,只能发送一个密钥。但另一种方法是将模型包含在URLconf本身中:您可以使用单个模式,但也可以在那里捕获模型名称。
url(r'^(?P<model>post|comment)_vote_down/(?P<pk>\d+)/$', 'post.views.post_vote_down'),
)
然后在视图中:
def vote_up(request, model, pk):
model_dict = {'post': Post, 'comment': Comment}
model_class = model_dict[model]
o = model_class.objects.get(pk=pk)
答案 1 :(得分:0)
改变这个:
url(r'^vote_up/(?P<obj>\d+)/$', 'post.views.vote_up'),
要
url(r'^vote_up/(?P<obj>[-\w]+)/$', 'post.views.vote_up'),
\d+
表示只有整数。
答案 2 :(得分:0)
您无法在URL中发送对象,您需要发送主键,然后从数据库中检索相应的对象。
def vote_up(request, obj): #portotype not working atm...
try:
o = Post.objects.get(pk=obj)
except Post.DoesNotExist:
o = Comment.objects.get(pk=obj)
except Comment.DoesNotExist:
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
o.votes += 1
o.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
答案 3 :(得分:0)
您需要在网址中区分评论和帖子:
urls.py
url(r'^vote_up/(?P<object_name>\w+)/(?P<id>\d+)/$', 'post.views.vote_up'),
views.py
def vote_up(request, object_name, id):
if object_name == 'comment':
# get id for comment
if object_name == 'post':
# get id for post
else:
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))