我正在尝试显示简报表单,但未在页面中显示
这是我的 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
中的来源答案 0 :(得分:1)
url路由器会将请求发送到第一个匹配的视图。这是唯一被调用的,并且该视图必须提供模板消耗的上下文数据。 (您也可以编写自己的context processor来插入所需的上下文。)
由于其他模式也与/footer/
匹配,因此您的请求可以通过其他视图清楚地处理。
url(r'^(?P<slug>[-\w]+)/$', views.BlogDetail.as_view(), name='entry_detail'),
如果另一个视图没有在上下文中提供form
,则Django无需渲染。
您的视图函数newsletter_detail()
未从其他视图调用,因此不使用该上下文。 (使用未定义的none
会导致运行时错误,这表明代码从未被评估过。)
Catch-all路由(例如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实例,(但你应该给它一个不如{{1}}的通用名称)。
答案 1 :(得分:0)
您可能需要在视图中进行一些更改,
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)
如果请求方法实际上是&#34; POST&#34;,您只需要使用request.POST
初始化表单。否则,只需初始化一个空白表格。