使用Django和Bootstrap创建表单

时间:2015-04-16 00:37:03

标签: python html css django twitter-bootstrap

好的,所以我创建了一个简单的购买表单,它使用了一些自定义表单字段。我已经渲染了一个简单的表单来测试它是否正常工作,如下所示。

<form id="category_form" method="post" action="/purchase/">
        {% csrf_token %}
        {% for hidden in form.hidden_fields %}
            {{ hidden }}
        {% endfor %}

        {% for field in form.visible_fields %}
            {{ field.errors }}
            {{ field.help_text }}
            {{ field }}
        {% endfor %}

        <input type="submit" name="submit" value="Make purchase" />
</form>

现在,我希望将它设置为Bootstrap 3.我设法使用django widget tweaks包没有任何问题。但是,当我提交表单时,我收到此错误'NoneType' object has no attribute 'replace'我在没有调整小部件的情况下尝试了它,但我仍然遇到同样的错误。

为什么会出现这种情况?原始表单工作得很好,没有样式,但一旦我设计它我得到上述错误。现在,如果我的理解是正确的,Django将一个字段和相应字段的样式相同,但是,我的一些字段类型是不同的。即下拉列表和文本框,不能以相同的方式设置样式。我不确定最好的方法是什么。

views.py

def checkout(request):
if request.method == 'POST':
    form = PurchaseForm(request.POST)
    if form.is_valid():
        form.save(commit=True)

        return index(request) # Change this to point to the confirmation page
    else:
        print (form.errors)
else:
    form = PurchaseForm()
return render(request, 'ticket/checkout.html', {'form': form})

checkout.html

<form class="form-horizontal" method="post" action="/cart/checkout/">
{% csrf_token %}

<fieldset>

<!-- Form Name -->
<legend>Card Details</legend>
<!-- Select Basic -->
<div class="form-group">
  <label class="col-sm-3 control-label" for="card-type">{{ form.payment_type.help_text }}</label>
  <div class="col-sm-9">
    {{ form.payment_type|attr:"id:card-type"|attr:"name:card-type"|attr:"class:form-control" }}
    {{ form.error }}
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-sm-3 control-label" for="card-name">{{ form.card_name.help_text }}</label>  
  <div class="col-sm-9">
    {{ form.card_name|attr:"id:card-name"|attr:"name:card-name"|attr:"type:text"|attr:"placeholder:Card Holder's Name"|attr:"class:form-control input-md"|attr:"required:"}}
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-sm-3 control-label" for="card-number">{{ form.card_number.help_text }}</label>  
  <div class="col-sm-9">
    {{ form.card_number|attr:"id:card-number"|attr:"name:card-number"|attr:"type:text"|attr:"placeholder:Credit / Debit card number"|attr:"class:form-control input-md"|attr:"required:"}}
  </div>
</div>

<!-- Select Basic -->
<div class="form-group">
  <label class="col-sm-3 control-label" for="expiry-date">{{ form.expiry_date.help_text }}</label>
  <div class="col-sm-4">
    {{ form.expiry_date|attr:"id:expiry-date"|attr:"name:expiry-date"|attr:"class:form-control col-sm-4" }}
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-sm-3 control-label" for="cvv-number">{{ form.security_code.help_text }}</label>  
  <div class="col-sm-9">
    {{ form.security_code|attr:"id:cvv-number"|attr:"name:cvv-number"|attr:"type:text"|attr:"placeholder:Security Code"|attr:"class:form-control input-md"|attr:"required:"}}
  </div>
</div>

<div class="form-group">
  <label class="col-sm-3 control-label" for="date">{{ form.date.help_text }}</label>  
  <div class="col-sm-9">
    {{ form.date|attr:"id:date"|attr:"name:date"|attr:"class:form-control input-md"|attr:"required:"}}
  </div>
</div>

<div class="form-group">
  <label class="col-md-4 control-label" for="Purchase"></label>
  <div class="col-md-8">
    <button id="Purchase" name="Purchase" class="btn btn-success">Purchase</button>
    <a href="javascript:history.go(-1)"><button id="Cancel" name="Cancel" class="btn btn-inverse">Cancel</button></a>
  </div>
</div>
</fieldset>

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解你的问题。但是我注意到1.表单中似乎没有标记。 2.也许你可以使用普通的html代替其他标签({{form.security_code | attr:&#34; id:cvv-number&#34; | attr:&#34; name:cvv-number&#34; ** **}} ), 如 3.要验证表单,您可以尝试编写类似的内容:          {%if form.password.errors%}        {%表示错误的形式.password.errors%} {{error}} {%endfor%} {%endif%}

希望你能尽快找出这个问题。

答案 1 :(得分:0)

我建议使用python包django-bootstrap3来设置表单的样式。它可以在https://github.com/dyve/django-bootstrap3

找到

希望这有帮助!