1

这可能是一个重复的问题,但我在这里找不到任何答案。我正在尝试编写一种能够采用两种不同模型的方法。我有一个 Post 模型和一个 Comment 模型,我希望 vote_up 方法来处理这两个模型的投票。

视图.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'))

网址.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,并且:当前的 URL,post/vote_up/Post 对象,与这些都不匹配。或当前 URL,post/vote_up/Comment 对象,与其中任何一个都不匹配。

我猜 \d+ 是恶棍,但似乎找不到正确的语法。

4

4 回答 4

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)
于 2013-09-10T10:15:49.400 回答
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'))
于 2013-09-10T10:05:00.260 回答
0

改变这个:

 url(r'^vote_up/(?P<obj>\d+)/$', 'post.views.vote_up'),

url(r'^vote_up/(?P<obj>[-\w]+)/$', 'post.views.vote_up'),

\d+仅表示整数。

于 2013-09-10T09:58:37.367 回答
0

您需要区分 url 中的评论和帖子:

网址.py

url(r'^vote_up/(?P<object_name>\w+)/(?P<id>\d+)/$', 'post.views.vote_up'),

视图.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'))
于 2013-09-10T10:13:13.957 回答