【问题标题】:Django URL regex complicationDjango URL 正则表达式复杂性
【发布时间】:2014-08-05 08:54:21
【问题描述】:

我无法为我的 django 应用定义 URL。

我想要这样当我打字时,

http://example.com/post/3 :: 我可以阅读帖子

http://example.com/post/3/edit :: 我可以编辑帖子

目前,我将其定义如下:

url(r'^post/(?P<id>\d+)/edit/$',
    'board.views.edit_post',
    name='edit_post'),

url(r'^post/(?P<id>\d+)',
    'board.views.view_post',
    name='view_post'),

但这似乎不起作用,因为当我点击链接到

的“编辑”链接时

"/post/{{ post.id }}/edit"

我在地址栏中获得了预期的网址,但没有进入编辑视图...

====================================

--编辑--

@login_required
def edit_post(request, id):
    if id:
        post = get_object_or_404(Post, id=id)
        if post.owner_user != request.user:
            return HttpResponseForbidden()
#     else:
#         post = Post(owner_user=request.user)

    if request.POST:
        form = PostEditForm(request.POST)
        if form.is_valid():
            form.save() 

            return HttpResponseRedirect('')
    else:
        form = PostEditForm()

    return (request,'edit_post.html', {
        'form': form})

还有

def view_post(request, id):   
    #context = RequestContext(request)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            form = form.save(commit=False)
            form.owner = request.user
            form.parent_post = get_object_or_404(Post, id=id)
            form.comment_type = 0
            form.save()

            return HttpResponseRedirect('')
    else:
        form = CommentForm()

    return render(request,'view_post.html', {
        #'comment' : get_object_or_404(Comment, parent_post = id),
        'comment': Comment.objects.filter(parent_post=id),
        'form': form,
        'post': get_object_or_404(Post, id=id)
    })

【问题讨论】:

  • 您确定正确命名了视图函数?这些路线看起来不错。
  • 最后用“/”尝试会发生什么?例如:“/post/{{ post.id }}/edit/”
  • 嗯,这很奇怪。在这种情况下,让我添加我的 view_post 和 edit_post 视图
  • @GustavoMeira 我得到:AttributeError at /post/5/edit/ 和 'tuple' 对象没有属性 'get'
  • 因为您在edit_post 末尾错过了对render 的呼叫:您只是直接返回参数。

标签: python regex django url


【解决方案1】:

好吧,我建议您开始使用基于类的视图,此外,为什么不呢。在大多数情况下,可以让你的生活更轻松,而你写得更少

class UpdatePost(UpdateView):
    model = Post # assuming you've made from your_app.models import Post call already
    fields = ['title', 'content', 'pub_date'] # for demonstration purposes
    template_name = 'post_form.html'

    @method_decorator(login_required) #Use login required on your dispatch method
    def dispatch(self, request, *args, **kwargs):
        pulled = Post.objects.get(id=kwargs['id']) 
        if pulled.created_by == request.user: #just to verify person making edit is rightly disposed to do so
            return super(UpdatePost, self).dispatch(request, *args, **kwargs)
        raise PermissionDenied

像这样甜美地截取你 url 中的 id

url(r'^app/edit/(?P<id>\d+)/$', views.UpdatePost.as_view(), name='edit'),

这就是我的工作方式。我从我的工作项目github.com/seanmavley/menpha.git 中提取了这个,但还没有测试这个调整后的版本。但它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2013-07-26
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    相关资源
    最近更新 更多