Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有可能使这两个django视图更干燥吗?_Python_Django_Python 3.x_Django Views_Dry - Fatal编程技术网

Python 有可能使这两个django视图更干燥吗?

Python 有可能使这两个django视图更干燥吗?,python,django,python-3.x,django-views,dry,Python,Django,Python 3.x,Django Views,Dry,我目前正在学习Python/Django堆栈,通过一些培训来构建一个博客 我目前有两个类似的视图用于添加新帖子和编辑现有帖子(post_new和post_edit),如下所示: def post_new(request): if request.method == "POST": form = PostForm(request.POST) if form.is_valid(): post = form.save(commit=Fal

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

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

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})
尽管这些视图执行不同的任务,但它们共享一些相同的代码


试图遵循最佳实践(DRY),是否有一种明智的方法来表达类似的观点?还是最好将这种长度的视图保留为长格式以便于阅读?

我个人会这样写:

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})

基本上,您将默认的
实例
值传递给
模型形式

,我个人会这样写:

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})
基本上,您可以将默认的
实例
值传递给可能要用于该操作的
模型

from django.views.generic.edit import CreateView, UpdateView

class PostCreate(CreateView):
    model = Post
    fields = ['name', ...]

class PostUpdate(UpdateView):
    model = Post
    fields = ['name', ...]
你可能想用它

from django.views.generic.edit import CreateView, UpdateView

class PostCreate(CreateView):
    model = Post
    fields = ['name', ...]

class PostUpdate(UpdateView):
    model = Post
    fields = ['name', ...]

切换到基于类的视图并不能解决代码重复的问题。除非创建mixin,否则设置作者和发布日期的代码将被复制。这并不一定比Gert建议的单个函数好。切换到基于类的视图并不能解决代码重复的问题。除非创建mixin,否则设置作者和发布日期的代码将被复制。这并不一定比Gert建议的单个函数更好。