2017-07-07 77 views
-2

我试图表现出的通讯形式,它是不是在页面表没有显示,只有按钮显示的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'), 
] 

Project directory

按钮显示 但没有显示形式..

这是我在网络浏览器源RIGHT-CLICK->VIEW SOURCE

+1

你当然不应该在窗体上使用'safe'过滤器。如果你删除它,它会工作吗? –

+0

我添加了它,因为它没有 –

+0

尝试{{form.email}} – badiya

回答

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) 

你只需要初始化的形式与request.POST,如果请求方法是真的y“POST”。否则,只需要初始化一个空白表单。

+0

这是非常感激的评论后,downvoting .. – zaidfazil

+0

这并没有工作 –

+0

这家伙怎么可能反对票呢? – hansTheFranz

1

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的通用名称)。

+0

那我该怎么办? –

+0

如果您希望此表单显示在每个页面上,您应该使用上下文处理器来包含您的表单实例。或者你可以直接写html格式的表单。确保表单的'action'将POST发送到可以处理表单数据的视图。 –

+1

对于脚注中的一个简单的“订阅”表单,我建议将它写为html,并设置路由'/ subscribe /'来处理POST请求。在这种简单的情况下使用django的表单框架没有任何好处(只有一个字段)。 Django文档有一个类似的例子。 https://docs.djangoproject.com/en/1。11/intro/tutorial04 /#写一个简单的表格 大多数网站也会使用ajax来实现这种功能。一旦你得到这个工作,你可以尝试用ajax来实现它,这样使用'subscribe'表单的访问者就不需要刷新页面。 –