首页 > 解决方案 > 如何在基本 html 模板 django 中创建一个简单的表单

问题描述

我有一个包含多个页面的 Django 应用程序。像菜单或页脚一样,所有这些页面中都重复了一些元素,所以我创建了一个基本模板并添加了这些重复的代码。现在我想在基本模板的页脚上方有一个表单。但我不知道如何使它工作。我应该创建一个返回 base.html 的视图吗?如何在网站的每个页面上继承此表单?请指导我;我有点酸了!

这是我的 context_processor :

def base_forms(request):
    return {       
        'info_form': BasedContactForm()
    }

这是我的 base.html:我在所有其他页面中扩展它:

<form method="post" action="">
      {% csrf_token %}
      {{ info_form }}
   </form>

这是我的博客应用程序视图:

def base_info_form(request):
 if request.method == 'POST':
    info_form = BaseContactForm(request.POST)
    if info_form.is_valid():
        info_form.save()
        return redirect('Home-Page')
    else:
        info_form = BaseContactForm()
    return render(request, '', {'info_form': info_form})

标签: djangodjango-viewsdjango-forms

解决方案


您可以通过设置将一些数据添加到全局上下文TEMPLATES > OPTIONS > context_processors-编写您自己的上下文处理器

对于扩展模板,请使用模板标签extendsDjango Docs)。

1. 将变量添加到上下文


创建yourapp/context_processors.py

from django.conf import settings

from yourapp.forms import MyForm


def base_data(request):
    data = {}
    # MyForm(request.GET, user=request.user)
    data["my_form"] = MyForm()
    data["my_email"] = settings.MYEMAIL
    return data

并将其添加context_processorssettings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
           ...
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
                'yourapp.context_processors.base_data',
            ],
        },
    },
]

现在您可以在任何模板中访问您的这些数据:

{{ my_form }}, {{ my_email }}

2.扩展模板


您还可以使用模板标签extends( Django Docs ) 来扩展您的模板:

template.html
base.html

在 template.html 中,以下路径将是有效的:

{% extends "base.html" %}
<div class="container">
    Some HTML code
</div>

附加信息TEMPLATESDjango Docs)和OPTIONSDjango Docs)可用参数。

更新


视图.py

def contact(request):
    if request.method == 'POST':
        form = BaseContactForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('Home-Page')
    else:
        form = BaseContactForm()
    return redirect(request.META.get('HTTP_REFERER'))

urls.py

path('contact/', views.contact, name='contact'),

推荐阅读