[英]Django with Crispy-forms VariableDoesNotExist
I have been trying to load a form into a modal for about a week now and I just can't figure out what it is I'm doing wrong. 我一直试图将一个表单加载到一个模态中大约一个星期,我只是无法弄清楚它是什么我做错了。 It is a simple form for someone to send an email to me, and I started out trying to modularize the form and am now just trying to load it direcly into base.html. 这是一个简单的形式,有人向我发送电子邮件,我开始试图模块化形式,现在我只是试图将它直接加载到base.html。
My model: 我的模特:
from django.db import models
# Create your models here.
class EmailMe(models.Model):
subject = models.CharField(max_length=63)
body = models.TextField(max_length=2047)
email = models.EmailField()
def __str__(self):#shows object title when called from command line
return self.name`
my form: 我的表格:
from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout
from emailme.models import EmailMe
class EmailMeForm(forms.ModelForm):
subject = forms.CharField(max_length=63)
body = forms.CharField(max_length=2047)
email = forms.EmailField()
class Meta:
model = EmailMe
fields = '__all__'
def __str__(self):#shows object title when called from command line
return self.name
def __init__(self, *args, **kwargs):
super(EmailMeForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'myModal'
self.helper.form_class = 'form-horizontal'
self.helper.form_action = 'emailme'
self.helper.form_method = 'POST'
self.helper.layout = Layout(
Fields(
'subject',
'body',
'email',
),
FormActions(
Submit('submit', 'submit')
)
)
My view: 我的观点:
from mysite.forms import EmailMeForm
def home(request):
return render_to_response('base.html')
def emailme(request):
if request.POST:
form = EmailMeForm(request.POST)
if form.is_valid():
return HttpResponseRedirect('home/')#reverse_lazy('home'))
else:
form = EmailMeForm()
ctx = {}
ctx.update(csrf(request))
args['form'] = form
return render_to_response('emailme_form.html',
{'form': form},
context_instance=ctx)
urls: 网址:
"""mysite URL Configuration
"""
from django.conf.urls import url, include
from django.contrib import admin
from mysite import views as mysite_views
from emailme import views as emailme_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^emailme/', emailme_views.emailme, name='emailme'),
url(r'^home/', mysite_views.home, name='home'),
]
base.html: base.html文件:
{% load crispy_forms_tags %}
<div class="modal-content">
{% csrf_token %}
{% crispy form form.helper %}
</div>
I'm using Django 1.9, crispy-forms, and bootstrap. 我正在使用Django 1.9,crispy-forms和bootstrap。 Here is the error: 这是错误:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/home/
Django Version: 1.9.8
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'emailme',
'crispy_forms',
'bootstrap3']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Template error:
In template /home/pi/Django-bootstrap/bin/mysite/templates/base.html, error at line 77
Failed lookup for key [%s] in %r 67 :
68 :
69 :
70 : <div class="container">
71 : <!-- Modal -->
72 : <div class="modal fade" id="myModal" role="dialog">
73 : <div class="modal-dialog">
74 : <!-- Modal content-->
75 : <div class="modal-content">
76 : {% csrf_token %}
77 : {% crispy form form.helper %}
78 : </div>
79 : </div>
80 : </div>
81 : </div>
82 :
83 :
84 :
85 : <div class="container">
86 : <!-- Example row of columns -->
87 : <div class="row">
Traceback:
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in _resolve_lookup
883. current = current[bit]
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/context.py" in __getitem__
77. raise KeyError(key)
During handling of the above exception ('form'), another exception occurred:
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in _resolve_lookup
889. if isinstance(current, BaseContext) and getattr(type(current), bit):
During handling of the above exception (type object 'Context' has no attribute 'form'), another exception occurred:
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in _resolve_lookup
898. current = current[int(bit)]
During handling of the above exception (invalid literal for int() with base 10: 'form'), another exception occurred:
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/pi/Django-bootstrap/bin/mysite/mysite/views.py" in home
13. return render_to_response('base.html')
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/shortcuts.py" in render_to_response
39. content = loader.render_to_string(template_name, context, using=using)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/loader.py" in render_to_string
97. return template.render(context, request)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/backends/django.py" in render
95. return self.template.render(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in render
206. return self._render(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in _render
197. return self.nodelist.render(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in render
992. bit = node.render_annotated(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in render_annotated
959. return self.render(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/crispy_forms/templatetags/crispy_forms_tags.py" in render
214. c = self.get_render(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/crispy_forms/templatetags/crispy_forms_tags.py" in get_render
107. actual_form = form.resolve(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in resolve
850. value = self._resolve_lookup(context)
File "/home/pi/Django-bootstrap/lib/python3.5/site-packages/django/template/base.py" in _resolve_lookup
905. (bit, current)) # missing attribute
Exception Type: VariableDoesNotExist at /home/
Exception Value: Failed lookup for key [form] in "[{'False': False, 'None': None, 'True': True}]"
The problem is that you are trying to use your form
in your base.html
(for all views). 问题是您尝试在base.html
使用您的form
(适用于所有视图)。 But the form is only added to the context in your emailme
view. 但是表单只会添加到您的emailme
视图中的上下文中。 The home page view ( home
) does not provide any form
, hence the error when you try to load the home page. 主页视图( home
)不提供任何form
,因此当您尝试加载主页时出现错误。
You either need to add the form to the home page view (and any other views that use base.html
): 您需要将表单添加到主页视图(以及使用base.html
任何其他视图):
def home(request):
return render_to_response('base.html', {'form': EmailMeForm()})
or use a context processor to insert the form into to the template context globally. 或使用上下文处理器将表单全局插入到模板上下文中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.