【问题标题】:DRYing out my Django view: Please help me!干燥我的 Django 视图:请帮助我!
【发布时间】:2011-05-19 09:58:49
【问题描述】:

我希望这是一个很好的第一个问题。我一直在尝试干燥我的 Django 代码,但不幸的是,我一直遇到几个错误! (如果我没有发布有问题的代码,请原谅我 - 我只会发布有效的代码)我尝试过使用@decorators,并将视图放在视图中。请帮帮我!

from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
from blog.models import Post, User, Blog, Comment
from blog.forms import CommentForm, PostForm, BlogForm
from django.core.urlresolvers import reverse
import datetime
from django.http import HttpResponseRedirect
from django.template import RequestContext
from django import forms

def limiter(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))

def postindex(request):
    posts = get_list_or_404(Post.objects.all())
    return render_to_response('index.html', {'posts':posts})

def onepost(request, postid):
    post = get_object_or_404(Post, pk=postid)
    if request.method == 'POST':
        if not request.user.is_authenticated():
            return HttpResponseRedirect(reverse('accounts.views.login_view'))
        form = CommentForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            c = Comment(owner=request.user,
                post=Post.objects.get(pk=postid),
                time=datetime.datetime.now(),
                text=cd['text'])
            c.save()
            return HttpResponseRedirect(reverse('blog.views.onepost', 
                args=[postid]))
    else:
        form = CommentForm()
    return render_to_response('single.html',
        {'post':post,'comments':post.comment_set.all(),
        'form':form},
        context_instance=RequestContext(request))

def userlist(request):
    users = get_list_or_404(User.objects.all())
    return render_to_response('userlist.html', {'users':users})

def bloglist(request, userid):
    blogs = get_list_or_404(Blog.objects.filter(owner__pk=userid))
    return render_to_response('bloglist.html', {'blogs':blogs})

def postlist(request, blogid):
    posts = get_list_or_404(Post.objects.filter(blog__pk=blogid))
    return render_to_response('postlist.html', {'posts':posts})

def landing(request):
    return render_to_response('landing.html', {})

def dash(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))
    user = request.user
    blogs = Blog.objects.filter(owner=request.user)
    comments = Comment.objects.filter(owner=request.user)
    posts = Post.objects.filter(blog__owner=request.user)
    return render_to_response('dash.html',
        {'user':user, 'blogs':blogs, 'comments':comments, 'posts':posts})

def newpost(request, blogid):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))
    blog = Blog.objects.get(pk=blogid)
    if not request.user == blog.owner:
        return HttpResponseRedirect(reverse('blog.views.dash'))
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            p = Post(title=cd['title'],
                blog=Blog.objects.get(pk=blogid),
                date=datetime.datetime.now(),
                content=cd['content'])
            p.save()
            return HttpResponseRedirect(reverse('blog.views.postlist', 
                args=[blogid]))
    else:
        form = PostForm()
    return render_to_response('chngpost.html',
        {'blog':blog,
        'form':form},
        context_instance=RequestContext(request))

def editpost(request, postid):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))
    post = Post.objects.get(pk=postid)
    if not request.user == post.blog.owner:
        return HttpResponseRedirect(reverse('blog.views.dash'))
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            post.title=cd['title']
            post.content=cd['content']
            post.save()
            return HttpResponseRedirect(reverse('blog.views.onepost', 
                args=[postid]))
    else:
        form = PostForm(initial={'title':post.title,'content':post.content})
    return render_to_response('chngpost.html',
        {'post':post,
        'form':form},
        context_instance=RequestContext(request))

def delpost(request, postid):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))
    post = Post.objects.get(pk=postid)
    if not request.user == post.blog.owner:
        return HttpResponseRedirect(reverse('blog.views.dash'))
    if request.method == 'POST':
        post.delete()
        return HttpResponseRedirect(reverse('blog.views.dash'))
    return render_to_response('delpost.html',
        {'post':post},
        context_instance=RequestContext(request))

def newblog(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))
    if request.method == 'POST':
        form = BlogForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            b = Blog(title=cd['title'],
                owner=request.user)
            b.save()
            return HttpResponseRedirect(reverse('blog.views.bloglist', 
                args=[request.user.pk]))
    else:
        form = BlogForm()
    return render_to_response('chngpost.html',
        {'form':form},
        context_instance=RequestContext(request))

def delcomment(request, commentid):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))
    comment = Comment.objects.get(pk=commentid)
    if not (request.user == comment.post.blog.owner) | (request.user == comment.owner):
        return HttpResponseRedirect(reverse('blog.views.dash'))
    if request.method == 'POST':
        comment.delete()
        return HttpResponseRedirect(reverse('blog.views.dash'))
    return render_to_response('delpost.html',
        {},
        context_instance=RequestContext(request))

(希望格式正确)我想特别考虑的代码是

if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('accounts.views.login_view'))

当然,如果您有更多建议,我们将不胜感激!太感谢了! `

【问题讨论】:

  • 欢迎来到 SO。 +1 我关心你的第一个问题 :)

标签: django django-views


【解决方案1】:
  1. 使用login_required装饰器(docs)
  2. 使用模型表单来编辑/创建模型。 (docs)
  3. 如果您只需将某些内容传递给模板,请使用 direct_to_template 通用视图 (docs)

【讨论】:

  • 其实不好意思,如果不是request.user == post.blog.owner: return HttpResponseRedirect(reverse('blog.views.dash')) 我也想取出部分你告诉我你会推荐我使用2和3吗?我已经在我的代码中使用了它们。谢谢!
  • 1.如果你想要一些更复杂的逻辑,你应该编写自己的装饰器。 2.如果CommentForm和PostForm已经是modelforms,你应该使用它的save()方法。如果要编辑对象,请将实例传递给构造函数。 3.例如postlist可以改写成一行:direct_to_template(template='postlist.html', extra_context={posts: Post.objects.filter(blog__pk=blogid)})你甚至可以从视图中删除这段代码并将它放在url中(点击我给出的文档链接)。
  • 我正在寻找如何编写自己的装饰器,但我并没有看到太多我真正了解的内容... 有你看懂的教程吗?感谢提示 2 和 3,我尤其不知道如何使用 ModelForm 的 save()。 :D
【解决方案2】:

您可以为此使用 @login_required 装饰器。您可以在 Django 文档中找到更多信息:http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required。

请描述您遇到的任何问题。

【讨论】:

猜你喜欢
  • 2016-05-07
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2014-05-08
  • 2023-03-18
  • 2010-11-26
相关资源
最近更新 更多