2016-03-03 24 views
1

我正在学习Python/Django堆栈,通过一些培训来构建博客。可能会让这两个django视图DRY-er?

我目前有如下添加新的和编辑现有员额(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),有没有一种明智的方法来制作这种类似的视图DRYer?或者长时间留下这种长度的观点以便于阅读更好吗?

回答

4

我会亲自写这样的:

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

0

您可能想要使用Class-based views

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

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

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

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

相关问题