表没有显示,只有按钮显示的Django
我试图表现出的通讯形式,它是不是在页面表没有显示,只有按钮显示的Django
显示这是我models.py
from django.db import models
# Create your models here.
class newsletter_user(models.Model):
email = models.EmailField()
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.email
这是我forms.py
from django import forms
from .models import newsletter_user
class newsletterForm(forms.ModelForm):
class Meta:
model = newsletter_user
fields = ['email']
def clean_email(self):
email = self.cleaned_data.get('email')
return email
这是我admin.py
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)
这是views.py
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)
这是HTML
<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>
这是我urls.py
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'),
]
按钮显示 但没有显示形式..
这是我在网络浏览器源RIGHT-CLICK->VIEW SOURCE
您可能需要在您的看法有些变化有点像这,
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
,如果请求方法是真的y“POST”。否则,只需要初始化一个空白表单。
url路由器将发送请求到第一个匹配视图。这是唯一被调用的,并且该视图必须提供模板消耗的上下文数据。 (您也可以编写自己的context processor来插入您在任何地方都需要的上下文。)
由于其他模式也匹配/footer/
,您的请求显然是由其他视图处理的。
url(r'^(?P<slug>[-\w]+)/$', views.BlogDetail.as_view(), name='entry_detail'),
如果其他视图不提供form
成的背景下,没有什么Django的渲染。
您的查看功能newsletter_detail()
未从其他视图调用,因此不使用上下文。 (使用未定义none
存在会造成运行时错误,这表明该代码是从来没有评价。)
[全部路线如entry_detail
要么被用作最后的URL路径,或进行更具体。例如,像r'^/blog/(?P<slug>[-\w]+)/$'
,它不会匹配/footer/
。
对于页脚中的一个简单的“订阅”表单,我建议将它编写为html,并设置路由/subscribe/
来处理POST请求。在这种简单的情况下使用Django的表单框架没有任何好处(只有一个字段)。
The django docs has an example of how you can implement something like this.
您footer.html
模板片段不应该要求不会自动由上下文处理器插入任何上下文。 Django的CsrfViewMiddleware提供了{% csrf_token %}
,这是一个你可以在模板片段中使用的例子,比如页脚。
如果您需要在页脚中使用一些复杂的表单,您可以编写自定义中间件以在每个上下文中插入一个Django表单实例(但您应该给它一个不如form
的通用名称)。
那我该怎么办? –
如果您希望此表单显示在每个页面上,您应该使用上下文处理器来包含您的表单实例。或者你可以直接写html格式的表单。确保表单的'action'将POST发送到可以处理表单数据的视图。 –
对于脚注中的一个简单的“订阅”表单,我建议将它写为html,并设置路由'/ subscribe /'来处理POST请求。在这种简单的情况下使用django的表单框架没有任何好处(只有一个字段)。 Django文档有一个类似的例子。 https://docs.djangoproject.com/en/1。11/intro/tutorial04 /#写一个简单的表格 大多数网站也会使用ajax来实现这种功能。一旦你得到这个工作,你可以尝试用ajax来实现它,这样使用'subscribe'表单的访问者就不需要刷新页面。 –
你当然不应该在窗体上使用'safe'过滤器。如果你删除它,它会工作吗? –
我添加了它,因为它没有 –
尝试{{form.email}} – badiya