【问题标题】:Two views with only one diffrent line of code两个视图,只有一行不同的代码
【发布时间】:2020-06-03 19:18:42
【问题描述】:

我有两个视图,只有一行不同的代码,两个视图的其余部分相同。如何防止代码重复?我可以删除 tag_view 并将可选参数作为 kwarg 添加到索引并根据它返回没有特定标签或标签的视图吗?它应该如何工作?以下是我的看法。

def index(request):
    post_form = AddPostForm(request.POST or None, instance=request.user)
    comment_form = AddCommentForm(request.POST or None, instance=request.user)
    if request.method == 'POST':
        # FORMULARZ DODAWANIA POSTU
        if post_form.is_valid():
            post_form.save()
            create_notifications(post_form.instance)

        # FORMULARZ DODAWANIA KOMENTARZA
        if comment_form.is_valid():
            comment_form.save()

    (posts, comments) = serve_post_and_comments_except_blocked(request)

    return render(request, 'mikroblog/index.html', {'posts': posts, 'comments': comments,
                                                    'post_form': post_form, 'comment_form': comment_form})


def tag_view(request, tag):
    post_form = AddPostForm(request.POST or None, instance=request.user)
    comment_form = AddCommentForm(request.POST or None, instance=request.user)
    if request.method == 'POST':
        # FORMULARZ DODAWANIA POSTU
        if post_form.is_valid():
            post_form.save()
            create_notifications(post_form.instance)

        # FORMULARZ DODAWANIA KOMENTARZA
        if comment_form.is_valid():
            comment_form.save()

    (posts, comments) = serve_post_and_comments_except_blocked(request)
    posts.filter(content_post__contains=tag)
    actual_tag = tag

    return render(request, 'mikroblog/tag.html', {'posts': posts, 'actual_tag': actual_tag, 'comments': comments,
                                                  'post_form': post_form, 'comment_form': comment_form})

【问题讨论】:

标签: python django


【解决方案1】:

我会定义一个这样的辅助函数(未测试):

def view_common(url, request, tag=None):
    post_form = AddPostForm(request.POST or None, instance=request.user)
    comment_form = AddCommentForm(request.POST or None, instance=request.user)
    if request.method == 'POST':
        # FORMULARZ DODAWANIA POSTU
        if post_form.is_valid():
            post_form.save()
            create_notifications(post_form.instance)

        # FORMULARZ DODAWANIA KOMENTARZA
        if comment_form.is_valid():
            comment_form.save()

    (posts, comments) = serve_post_and_comments_except_blocked(request)
    posts.filter(content_post__contains=tag)

    parameters = {'posts': posts, 'comments': comments,'post_form': post_form, 'comment_form': comment_form}

    if tag:
        parameters['actual_tag'] = tag

    return render(request, url, parameters)

然后像这样重新定义你的 2 个函数:

def tag_view(request, tag):
    return view_common('mikroblog/tag.html', request, tag=tag)

def index(request):
    return view_common('mikroblog/index.html', request)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多