【问题标题】:django views.py avoid duplicate code in viewsdjango views.py 避免视图中的重复代码
【发布时间】:2018-07-07 16:55:07
【问题描述】:

我使用 DJANGO 创建了一个简单的博客,views.py 中有三个类

views.py

def blog(request):
    posts=blog.objects.filter(createddate__lte=timezone.now()).order_by('-createddate')
    if request.method == "POST":
       name = request.POST.get('name')
       message = request.POST.get('message')
       contact.objects.create(name=name message=message)
    return render(request, 'base.html'{'posts':posts})

def blog_details(request,slug):
    posts=blog..objects.filter(createddate__lte=timezone.now()).order_by('-createddate')
    pos=get_object_or_404(app_descripts, slug_title=slug)
    if request.method == "POST":
       name = request.POST.get('name')
       message = request.POST.get('message')
       contact.objects.create(name=name message=message)
    return render(request, 'blog_details.html'{'posts':posts,'pos':pos})

def about(request):
    posts=blog..filter(createddate__lte=timezone.now()).order_by('-createddate')
    if request.method == "POST":
       name = request.POST.get('name')
       message = request.POST.get('message')
       contact.objects.create(name=name message=message)
    return render(request, 'about.html'{'posts':posts})

在html中我使用这种方式是因为我有一些代码:

{% extends 'blog/base.html' %}
    {% block content %}
         .......................
        {% endblock %}

在 base.html 块外的内容中,我有一个简单的包含,其中包含所有帖子的代码(

posts=blog..filter(createddate__lte=timezone.now()).order_by('-createddate'))。

但要查看所有页面(博客、博客详细信息、关于)中的帖子必须编写此代码(

posts=blog..filter(createddate__lte=timezone.now()).order_by('-createddate'))

在所有视图中都可以正常工作。 这发生在我的 html 联系表单中,因为内容不足。

如何避免在所有视图中执行相同的代码?

【问题讨论】:

  • 确保您已导入模型类。例如from .models import Blog, Contact。另外,请详细说明您的问题并修复您的格式,例如而不是blog.objects.filter. ...,你应该写Blog.objects.filter. ...。代码更正:contact.objects.create(name=name, message=message)return render(request, 'blog_details.html', {'posts':posts,'pos':pos})
  • 您应该使用基于类的视图,它们会自动为您处理所有这些内容。

标签: python django python-2.7 django-views


【解决方案1】:

我建议你将重复的代码写在另一个函数中,并从你需要的每个视图中调用它。

def get_posts():
    # Here you write your repeated code

从你的角度来称呼它

def my_view(request):
    posts = get_posts()
    return render(request, 'template.html', {'posts': posts})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多