表格没有显示,只有按钮显示Django

时间:2017-07-07 14:27:42

标签: django django-forms django-views

我正在尝试显示简报表单,但未在页面中显示

这是我的 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

中的来源

2 个答案:

答案 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初始化表单。否则,只需初始化一个空白表格。