同一django模板中的列表和表单

时间:2018-11-26 14:49:26

标签: django django-forms django-templates django-views

我有一个网站的页面布局,一个部分包含最新帖子列表,另一部分包含联系表单。 这意味着我需要将帖子列表的逻辑和联系表都输入到同一模板(home.html)

我按如下方式进行了工作,但是那感觉不像是正确的解决方案...相当混乱。

您有更好的方法吗?

views.py


def post_list(request):

    # Pull relevant posts from the database
    posts = Post.objects.filter(status='Published').order_by('-created')
    return posts


def home_page(request):

    # Contact form logic
    if request.method == 'GET':
        form = ContactForm()
    else:
        form = ContactForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            from_email = form.cleaned_data['from_email']
            message = form.cleaned_data['message']
            try:
                send_mail(name, message, from_email, ['admin@example.com'])
            except BadHeaderError:
                return HttpResponse('Invalid header found')
            messages.success(request, 'Mesage delivered')

    # Call the post_list() function
    posts = post_list(request)

    # Stuff it all into the home page template
    context = {'posts':posts, 'form':form}
    return render(request, "home.html", context)    

1 个答案:

答案 0 :(得分:0)

如果仅将全部内容保留为Django,那么您的方法实际上很好。除了post_list函数不应在views.py中定义之外,因为它实际上不是视图函数。

更好的方法是使用自定义方法Post创建一个published() custom model manager,以便在您的home_page视图函数中可以执行以下操作:

posts = Post.objects.published()

published()方法“知道”如何过滤正确的帖子并对其进行适当排序。将来,它甚至可以根据用户是否具有某些特权(例如:还返回将来将为工作人员发布的职位。

此逻辑属于模型(在这种情况下为模型管理器),而不属于视图。

另一种方法,尤其是当您开始处理需要来自各种不同地方的信息的更复杂的视图时,尤其是为通过ajax调用通过javascript获取的帖子列表创建API视图。然后,您的home_page()函数仅需要使用表单返回呈现的HTML模板,而javascript将分别获取帖子列表。更加困难,因为您必须使用javascript填充模板。那是诸如React或Angular之类的框架使之变得更容易的地方。