![](/img/trans.png)
[英]BootstrapError Parameter “form” should contain a valid Django Form
[英]django-bootstrap3 Parameter "field" should contain a valid Django BoundField?
我正在使用 django-bootstrap3 在模板上呈现我的表单,当我尝试加载带有表单的页面时,我一直在努力寻找导致错误的原因Parameter "field" should contain a valid Django BoundField
。 我在下面附上了我的代码和错误。 有人可以指出我做错了什么吗?
表单.py
class OrderForm(forms.Form):
first_name = forms.CharField(max_length=50)
last_name = forms.CharField(max_length=50)
email = forms. EmailField(max_length=50)
institution_name = forms.CharField(max_length=150)
phone = forms.IntegerField()
address = forms.CharField(max_length=100)
city = forms.CharField(max_length=50)
item = forms.CharField(max_length=100)
serial_number = forms.CharField(max_length=50)
problem = forms.CharField(widget=forms.Textarea(attrs—Crows':10,'cols':18,'style':'resize:none', [placeholder':'Please define your problem here'l),label='Problem description')
[placeholder':'Please define your problem here'l),label='Problem description')
视图.py
def Orderview(request):
if request.method == 'Post':
order_form = OrderForm(request.POST)
if order_form.is_valid(): cd = order form.cleaned data subject = '{} repair order from {}'.format(cd['item'],cd['institution_name']) from_email = cd['email'] to = [settings.EMAIL_HOST_USER,] ctx = { 'first_name':cd['first_name'], 'last_name':cd['last_name'], 'email':cd['email'], 'institution_name':cd['institution_name'], 'phone':cd['phone'], 'address':cd['address'], 'city':cd['city'], 'item':cd['item'], 'serial_number.:cd['serial_number'], 'problem':cd['problem'], } message = get_template('electroapp/email/order.html').render(Context(ctx)) msg = EmailMessage(subject,message,to=to,from_email=from_email) msg.content_subtype='html' msg.send() messages.success(request,' Your Repair order has been sent',) return redirect('electroapp:repair_order') else: order_form = OrderForm() return render(request,'electroapp/orderform.html',{'Order_form':order_form})
这可能是因为某些领域可能是missing.Take看看这个
您可以执行以下操作以查看可用的字段:
<form role="form" method="post">
{% csrf_token %}
{% bootstrap_form order_form %}
{% buttons submit='OK' reset="Cancel" %}{% endbuttons %}
</form>
然后尝试找出为什么缺少字段。
参数“field”应该包含一个有效的 Django BoundField
为什么他们不能直接告诉我们哪个实际领域? 好吧,这就是我解决它的方法。
稍微调试一下,你会发现这是在 renderers.py 中抛出的:
class FieldRenderer(BaseRenderer):
"""Default field renderer."""
# These widgets will not be wrapped in a form-control class
WIDGETS_NO_FORM_CONTROL = (CheckboxInput, RadioSelect, CheckboxSelectMultiple, FileInput)
def __init__(self, field, *args, **kwargs):
if not isinstance(field, BoundField):
raise BootstrapError('Parameter "field" should contain a valid Django BoundField.')
self.field = field
super().__init__(*args, **kwargs) ...
该消息没有帮助,但可以在您的开发/测试环境中修复。
警告:以下内容将使您的保修失效::)
在 library.py(例如 ~/.virtualenvs/your_env/lib/python3.8/site/packages/django/template/library.py)中的渲染链中往上走几步,找到 SimpleNode。
class SimpleNode(TagHelperNode):
def __init__(self, func, takes_context, args, kwargs, target_var):
super().__init__(func, takes_context, args, kwargs)
self.target_var = target_var
def render(self, context):
resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
output = self.func(*resolved_args, **resolved_kwargs)
if self.target_var is not None:
context[self.target_var] = output
return ''
if context.autoescape:
output = conditional_escape(output)
return output
将原始文件复制到备份后,按如下方式更改。 我们正在绕行
output = self.func(*resolved_args, **resolved_kwargs)
尝试/除外。 结果如下:
class SimpleNode(TagHelperNode):
def __init__(self, func, takes_context, args, kwargs, target_var):
super().__init__(func, takes_context, args, kwargs)
self.target_var = target_var
def render(self, context):
resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
###
from bootstrap3.exceptions import BootstrapError
try:
output = self.func(*resolved_args, **resolved_kwargs)
except BootstrapError as b:
raise BootstrapError(str(b).replace('"field"', self.args[0].token)) from b
###
if self.target_var is not None:
context[self.target_var] = output
return ''
if context.autoescape:
output = conditional_escape(output)
return output
在 SimpleNode 类中,我们可以访问无法呈现的字段的名称。 所以我们在那里拦截异常并重新抛出它并注入有用的花絮。 瞧,您现在将获得一个异常报告,告诉您实际的问题字段。 干杯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.