2017-05-07 77 views
1

我在footer.html中订阅了一个表单,它包含在base.html中,所以表单应该在网站上的每个页面上工作。我为此使用了context_processor解决方案,并且一切正常,但由于某些原因,数据不会保存在数据库中。我花了几个小时在Stack上寻找适当的解决方案,但并没有让它节省。Django ModelForm不保存数据

类似的问题是here,但也不适合我。应该是简单的东西,但是因为我是django的新成员,所以对此有点复杂。 请帮忙。在此先感谢

注:可以肯定,'catalogue.context_processors.SubscribeFormGlobal'被添加到设置

models.py

from django.db import models 


class Subscriber(models.Model): 
    email = models.EmailField() 

    def __str__(self): 
     return self.email 

forms.py

from django import forms 
from .models import Subscriber 


class SubscriberForm(forms.ModelForm): 
    class Meta: 
     model = Subscriber 
     fields = ('email',) 

context_processors.py

from .forms import SubscriberForm 


def SubscribeFormGlobal(request): 
    return {'subscribe_form': SubscriberForm()} 

views.py

def subscribe_us(request): 
    if request.method == "POST": 
     subscribe_form = SubscriberForm(request.POST) 
     if subscribe_form.is_valid(): 
      subscribe_form.save(commit=False) 
      subscribe_form.author = request.user 
      subscribe_form.published_date = timezone.now() 
      subscribe_form.save() 
    else: 
     subscribe_form = SubscriberForm() 
    return render(request, '', {'subscribe_form': subscribe_form}) 

urls.py

from catalogue import views 
from catalogue.models import Bancnote 

urlpatterns = [ 
    url(r'^$', views.bons_list, name='bons_list'), 
    url(r'^(?P<pk>\d+)$', DetailView.as_view(model=Bancnote, template_name='catalogue/bon_detail.html')), 
    url(r'^feedback/$', views.feedback, name='feedback'), 
    url(r'^$', views.subscribe_us, name='subscribe') 
] 

footer.html

{% load widget_tweaks %} 

{% block footer %} 
    <footer> 
     <div class="container-fluid"> 
      <div class="container-fluid"> 
       <div class="row" style="padding-top: 15px;"> 
        <div class="col-lg-1"> 
         <i style="color:#f84c48; margin-top: -10px" class="fa fa-envelope-o fa-5x" 
          aria-hidden="true"></i> 
        </div> 
        <div class="col-lg-4 col-lg-offset-1"> 
         <p id="text-email">Test</p> 
        </div> 
        <div class="col-lg-6"> 
         <form action="{% url 'subscribe' %}" method="POST"> 
          {% csrf_token %} 
          <div class="input-group input-group-lg"> 
           {{ subscribe_form.as_p }}   
           <span class="input-group-btn"> 
            <button type="submit" style="background:#1d6e87; color: white; border: 0" 
             class="btn btn-default">Subscriber</button> 
           </span> 
          </div> 
         </form> 
        </div> 
       </div> 
      </div> 
       <hr style="margin: 10px 0; border-color: #d6d6d6"> 
      </div> 
      <div class="container-fluid"> 
       <div class="row"> 
        <div class="col-lg-4 col-md-4"> 
         <h4>Contacts</h4> 
         <p> 
          <i class="fa fa-map-marker contacts"></i> 
          Test 
         </p> 
         <p> 
          <i class="fa fa-phone contacts"></i> 
          Test 
         </p> 
         <p> 
          <i class="fa fa-envelope contacts"></i> 
          [email protected] 
         </p> 
        </div> 
        <div class="col-lg-4 col-md-4"> 
         Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur error quidem sit velit? A, 
         ab, animi aut culpa ea eos ex illo itaque iure nisi officiis quasi quia soluta veritatis! 
        </div> 
        <div class="col-lg-4 col-md-4"> 
         <div id="social-networks"> 
          <h4>Social Networks</h4> 
          <a href="https://vk.com/" target="_blank"><i class="fa fa-vk"></i></a> 
          <a href="https://facebook.com/" target="_blank"><i class="fa fa-facebook"></i></a> 
          <a href="https://twitter.com/" target="_blank"><i class="fa fa-twitter"></i></a> 
          <a href="https://instagram.com/" target="_blank"><i class="fa fa-instagram"></i></a> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </footer> 
{% endblock %} 

回答

1

您不能拥有两个具有相同URL模式的视图 - 您同时拥有bons_list和订阅根URL。这意味着只有bons_list视图才会被调用。

您需要为其订阅自己的URL。

(当您这样做时,由于render调用中的空模板名称会导致提交错误;不确定为什么要这么做,您需要提供一个模板以在表单不显示时进行渲染。有效的你也应该当有效的重定向。想必你会回重定向到主页)

+0

哦,这真的有用!我在渲染过程中滑过了该字段,因为我需要在提交后保留在同一页面上,你知道如何做到这一点吗?我已经读过

可以做到这一点,但在这种情况下,我不会访问我的视图 – Michael

+0

从不知道,我发现这个返回重定向(request.META ['HTTP_REFERER']),但现在我注意到我的表单不显示在某些页面上,主页面和对象详细页面都显示出来,但反馈页面不显示。它可能是再次与urls的东西? – Michael

+0

不要用agaig,应该用usin渲染render_to_response – Michael

1

你的问题就出在你这里urls.py

url(r'^$', views.bons_list, name='bons_list'), 
url(r'^(?P<pk>\d+)$', DetailView.as_view(model=Bancnote, template_name='catalogue/bon_detail.html')), 
url(r'^feedback/$', views.feedback, name='feedback'), 
url(r'^$', views.subscribe_us, name='subscribe') 

方式Django的匹配它的网址将匹配匹配请求的第一个正则表达式。永远不会调用urls.py写入订阅视图的方式。您需要一个不同的网址来发布请求才能使其工作。

+0

谢谢你的回答,你知道如何在表单提交后指定返回当前页面的渲染吗? – Michael

+0

从不知道,发现这个返回重定向(request.META ['HTTP_REFERER']) – Michael

相关问题