首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django脆脆表单建模自定义表单

使用django脆脆表单建模自定义表单
EN

Stack Overflow用户
提问于 2022-10-18 02:09:03
回答 1查看 55关注 0票数 0

我遇到了这个问题,我想使用从互联网下载的模板中的django-crispy表单来建模字段的样式。

该领域如下所示:

本节的html是(显然使用bootstrap5 ):

代码语言:javascript
复制
<div class="form-group mb-4">
    <label for="id_username">Username</label>
    <div class="input-group">
        <span class="input-group-text" id="basic-addon1">
            <svg class="icon icon-xs text-gray-600" fill="currentColor" viewBox="0 0 
                20 20" xmlns="http://www.w3.org/2000/svg"> <g 
                transform="translate(0.000000,20.000000) scale(0.100000,-0.100000)" 
                fill-rule="evenodd" stroke="none"> <path d="M72 168 c-18 -18 -14 -56 
                7 -68 26 -14 50 -3 57 26 11 42 -34 72 -64 42z M48 59 c-34 -20 -17 
                -29 52 -29 39 0 70 4 70 10 0 26 -87 40 -122 19z"/></svg>
        </span>                 

        <input type="text" class="form-control" placeholder="admin" name="username" 
            id="id_username" autofocus required>

    </div>  
</div>

使用django-crispy forms,我尝试使用来自Layout()crispy_forms.layout对其进行建模,并在django中使用forms.py中的表单类:

代码语言:javascript
复制
from django import forms
from django.utils.translation import gettext, gettext_lazy as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, MultiField, Fieldset, Submit, Div, HTML, Field, Row

class LoginForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.layout = Layout(
            Div(
                Div(
                    HTML('<span class="input-group-text" id="basic-addon1">'
                         '<svg class="icon icon-xs text-gray-600" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">'
                             '<g transform="translate(0.000000,20.000000) scale(0.100000,-0.100000)" fill-rule="evenodd" stroke="none">' 
                             '<path d="M72 168 c-18 -18 -14 -56 7 -68 26 -14 50 -3 57 26 11 42 -34 72 -64 42z M48 59 c-34 -20 -17 -29 52 -29 39 0 70 4 70 10 0 26 -87 40 -122 19z"/>'
                        '</svg>'
                        '</span>'
                    ),
                    Field('username',   css_class='form-control', placeholder='admin', autofocus=True, required=True),
                    css_class="input-group"
                ),
                css_class="form-group mb-4"
            ),
        )

    username = forms.CharField(label=_('Username'),)

看起来是这样的:

在从浏览器中检查html时:

代码语言:javascript
复制
<div class="form-group mb-4">
    <div class="input-group"> 
        <span class="input-group-text" id="basic-addon1">
            <!-- THAT SVG CODE -->
        </span> 
        <div id="div_id_username" class="control-group"> 
             <label for="id_username" class="control-label requiredField">
                    Username
                    <span class="asteriskField">*</span>
             </label> 
        ####==>#### <div class="controls">
             <input type="text" name="username" maxlength="150" class="form-control textinput textInput" placeholder="admin" autofocus="True" required="" id="id_username"> </div> </div> 
        ####==>#### </div>
    </div>
</div>

这里非常接近,但问题是,使用来自Fieldcrispy_forms.layout<input>文本字段上添加了一个<div> .

你知道我能摆脱它吗?

显然,我可以使用HTML()crispy_forms.layoutLayout()中复制和粘贴整个代码,但随后它就没有达到使用django窗体的目的。-我本可以从模板中呈现它,然后从request.POST中提取字段。

知道怎么解决这个问题吗?非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2022-10-18 13:53:34

通过创建一个名为templateinput_field_only.html,我设法绕过了它。

代码语言:javascript
复制
{% load crispy_forms_field %}

<input type="{{ field.widget_type }}" class="form-control" placeholder="admin" name="{{ field.name }}" id="{{ field.id_for_label }}">

保存到templates目录。

然后在forms.py中,我将与LoginForm一起使用新的自定义模板

代码语言:javascript
复制
class InputFieldOnly(Field):
    template = '<APP_NAME>/templates/input_field_only.html'


class LoginForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.layout = Layout(
            Div(
                Div(
                    HTML('<span class="input-group-text" id="basic-addon1">'
                         '<svg class="icon icon-xs text-gray-600" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">'
                             '<g transform="translate(0.000000,20.000000) scale(0.100000,-0.100000)" fill-rule="evenodd" stroke="none">' 
                             '<path d="M72 168 c-18 -18 -14 -56 7 -68 26 -14 50 -3 57 26 11 42 -34 72 -64 42z M48 59 c-34 -20 -17 -29 52 -29 39 0 70 4 70 10 0 26 -87 40 -122 19z"/>'
                        '</svg>'
                        '</span>'
                    ),
                                        # Add InputFieldOnly
                    InputFieldOnly('username'),
                    css_class="input-group"
                ),
                css_class="form-group mb-4"
            ),
        )
    # Add the widget argument here
    username = forms.CharField(label=_('Username'),)

希望能对遇到同样问题的人有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74104923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档