繁体   English   中英

django-bootstrap3 参数“field”应该包含一个有效的 Django BoundField?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM