python - 可以使这两个 django View 变干吗?

标签 python django python-3.x django-views dry

我目前正在通过一些构建博客的培训来学习 Python/Django 堆栈。

我目前有两个用于添加新帖子和编辑现有帖子(post_new 和 post_edit)的类似 View ,如下所示:

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect("post_detail", pk=post.pk)      
    else:
        form = PostForm()    
    return render(request, "blog/post_edit.html", {"form": form})


def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user 
            post.published_date = timezone.now()
            post.save()
            return redirect("post_detail", pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, "blog/post_edit.html", {"form":form})

尽管这些 View 执行不同的工作,但它们共享一些相同的代码。

尝试遵循最佳实践 (DRY),是否有一种明智的方法可以让类似的观点成为 DRYer?还是最好将这种长度的 View 保留为长格式以便于阅读?

最佳答案

我个人会这样写:

def post_edit(request, pk=None):
    if pk is not None:
        post = get_object_or_404(Post, pk=pk)
    else:
        post = None
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user 
            post.published_date = timezone.now()
            post.save()
            return redirect("post_detail", pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, "blog/post_edit.html", {"form":form})

基本上,您将默认的 instance 值传递给 ModelForm

关于python - 可以使这两个 django View 变干吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35771142/

相关文章:

python - 子类化 logging.Formatter 更改 logging.Formatter 的默认行为

python - “float”对象在 Newton-Raphson 迭代中不可迭代

python - Scrapy XPath 页面上的所有链接

python - 亚马逊 S3 权限

python - 架构 - 能够在 Django 中更改电子邮件地址(主要用户 ID)

python - subprocess.run 简单场景失败

python - 为什么对于这段代码,Python 3.1 比 2.6 慢?

python - 如何将 PyPI 包上传到 Nexus3

python - 读取 Django 模型的字段选项

python - Django:在模板中访问多对多(反向)