表单未显示,只有按钮显示Django

表单未显示,只有按钮显示Django,django,django-forms,django-views,Django,Django Forms,Django Views,我正在尝试显示一个时事通讯表单,但它没有显示在页面中 这是我的模特 这是我的表格 这是我的管理员 这是views.py 这是html 这是我的URL.py 我的 显示该按钮 但是表格没有显示 这是我在web浏览器中的源代码您可能需要在视图中做一些类似这样的更改 def newsletter_subscribe(request): if request.method == 'POST': form = newsletterForm(request.POST)

我正在尝试显示一个时事通讯表单,但它没有显示在页面中

这是我的模特

这是我的表格

这是我的管理员

这是views.py

这是html

这是我的URL.py

我的

显示该按钮 但是表格没有显示


这是我在web浏览器中的源代码

您可能需要在视图中做一些类似这样的更改

def newsletter_subscribe(request):
    if request.method == 'POST':
        form = newsletterForm(request.POST)
        if form.is_valid(): 
            instance = form.save(commit=false) 
            if newsletter_user.objects.filter(email=instance.email).exists(): 
                print("already exists") 
            else: 
                instance.save() 
    else:
        form = newsletterForm()
    context = {'form':form,} 
    template = "/blog/templates/footer.html" 
    return render(request, template, context)

如果request方法实际上是POST,则只需使用request.POST初始化表单。否则,只需初始化一个空白表单。

url路由器将向第一个匹配视图发送请求。这是唯一被调用的视图,该视图必须提供模板使用的上下文数据。您还可以编写自己的上下文,以便在任何地方插入所需的上下文

由于另一个模式也与/footer/匹配,所以您的请求显然由其他视图处理

url(r'^(?P<slug>[-\w]+)/$', views.BlogDetail.as_view(), name='entry_detail'),
如果另一个视图没有在上下文中提供表单,Django就没有任何东西可以呈现

不会从其他视图调用“查看”函数“时事通讯详细信息”,因此不会使用上下文。使用未定义的none将导致运行时错误,这表明代码从未被计算过

捕获所有路由(如entry_detail)应用作最后一个url路由,或使其更加具体。例如,类似于r'^/blog/?P[-\w]+/$'的内容将与/footer/不匹配


对于页脚中的简单订阅表单,我建议将其编写为html,并设置route/subscribe/来处理POST请求。对于这样一个简单的案例,使用Django的表单框架没有任何好处,只有一个字段

您的footer.html模板片段不需要任何上下文处理器不会自动插入的上下文。Django的CsrfViewMiddleware提供了{%csrf_token%},因此这是一个可以在模板片段(如页脚)中使用的示例


如果您的页脚中需要一些复杂的表单,您可以编写自定义中间件在每个上下文中插入Django表单实例,但您可能应该给它一个比表单更通用的名称

您当然不应该在表单上使用安全过滤器。如果你删除它,它能工作吗?我添加它是因为它没有尝试{{form.email}}结果是什么html。在web浏览器中使用“显示源代码”?在哪里定义“无”?表单=新闻稿FormRequest.POST或无。这可能应该是“无”,否则会引发错误。重要的是,你的问题包含了实际的代码,案例的错误。那么我应该怎么做呢?如果你想在每个页面上显示这个表单,你应该使用上下文处理器来包含你的表单实例。或者您可以将表单编写为普通html。确保表单的操作将POST发送到可以处理表单数据的视图。对于页脚中的简单订阅表单,我建议将其编写为html,并设置一个route/subscribe/来处理POST请求。对于这样一个简单的案例,使用django的表单框架没有任何好处,只有一个字段。django文档有一个类似的示例。大多数网站也会使用ajax实现这种功能。一旦你做到了这一点,你可以尝试用ajax实现它,这样使用订阅表单的访问者就不需要刷新页面了。这家伙怎么可能否决投票呢?
from django.contrib import admin

from .models import newsletter_user
# Register your models here.
class newsletterAdmin(admin.ModelAdmin):
    list_display = ('email','date_added',)

admin.site.register(newsletter_user,newsletterAdmin)
from django.shortcuts import render
from .models import newsletter_user
from .forms import newsletterForm

# Create your views here.
def newsletter_subscribe(request):
    form = newsletterForm(request.POST or none)

    if form.is_valid():
        instance = form.save(commit=false)
        if newsletter_user.objects.filter(email=instance.email).exists():
            print("already exists")
        else:
            instance.save()

    context = {'form':form,}
    template = "/blog/templates/footer.html"
    return render(request, template, context)
<form method="post" action=''>
    <div class = "input-group">
        {{form}}  {% csrf_token %}
        <span class = "input-group-btn">
            <button class="btn btn-default" type="submit">Subscribe</button>

        </span>
    </div>
</form>
urlpatterns = [

    url(r'^admin/', admin.site.urls),
    url(r'^$', views.BlogIndex.as_view(), name='home'),
    url(r'^(?P<slug>[-\w]+)/$', views.BlogDetail.as_view(), name='entry_detail'),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
    url(r'^footer/$', subscribe_views.newsletter_subscribe, name='subscribe'),
]
def newsletter_subscribe(request):
    if request.method == 'POST':
        form = newsletterForm(request.POST)
        if form.is_valid(): 
            instance = form.save(commit=false) 
            if newsletter_user.objects.filter(email=instance.email).exists(): 
                print("already exists") 
            else: 
                instance.save() 
    else:
        form = newsletterForm()
    context = {'form':form,} 
    template = "/blog/templates/footer.html" 
    return render(request, template, context)
url(r'^(?P<slug>[-\w]+)/$', views.BlogDetail.as_view(), name='entry_detail'),