假设我有一个形式

class SampleClass(forms.Form):
    name = forms.CharField(max_length=30)
    age = forms.IntegerField()
    django_hacker = forms.BooleanField(required=False)

有没有办法为我定义css类在各个领域这样,我可以再使用的jQuery基于类在我的呈现的页面?

我希望不要有手工建造的形式。

有帮助吗?

解决方案 2

回答了我自己的问题。

http://docs.djangoproject的.com / EN的/ dev / REF /形式/部件/#django.forms.Widget.attrs

我没有意识到它被传递给了widget构造函数。

其他提示

另一个不需要更改python代码的解决方案因此更适合设计人员和一次性表示更改: Django的插件-调整的。希望有人会发现它很有用。

这是在声明类中的字段后向窗口小部件添加类定义的另一种解决方案。

def __init__(self, *args, **kwargs):
    super(SampleClass, self).__init__(*args, **kwargs)
    self.fields['name'].widget.attrs['class'] = 'my_class'

使用 django小的调整, 它易于使用,并工作得很好。

否则,这可以通过使用定义模板的过滤器。

考虑到你呈现的形式是这样的:

<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject }}
    </div>
</form>

形式。问题是一个实例 BoundField 其具有的 as_widget 法。

你可以创建一个定义过滤器"addcss"在"my_app/templatetags/myfilters.py"

from django import template

register = template.Library()

@register.filter(name='addcss')
def addcss(value, arg):
    css_classes = value.field.widget.attrs.get('class', '').split(' ')
    if css_classes and arg not in css_classes:
        css_classes = '%s %s' % (css_classes, arg)
    return value.as_widget(attrs={'class': css_classes})

然后用你的过滤器:

{% load myfilters %}
<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject|addcss:'MyClass' }}
    </div>
</form>

形式。主题随后将呈现与"MyClass"css类。

希望这种帮助。

编辑1

  • 根据更新过滤器 dimyG's答案

  • 添加django部件调整的链接

编辑2

  • 根据更新过滤器 Bhyd's评论

扩展指向docs.djangoproject.com的方法:

class MyForm(forms.Form): 
    comment = forms.CharField(
            widget=forms.TextInput(attrs={'size':'40'}))

我认为必须知道每个字段的本机窗口小部件类型很麻烦,并认为覆盖默认值只是为了在表单字段上放置类名称很有趣。这似乎对我有用:

class MyForm(forms.Form): 
    #This instantiates the field w/ the default widget
    comment = forms.CharField()

    #We only override the part we care about
    comment.widget.attrs['size'] = '40'

这对我来说似乎有点清洁。

如果您希望表单中的所有字段都继承某个类,您只需定义一个父类,该类继承自 forms.ModelForm ,然后从中继承

class BaseForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BaseForm, self).__init__(*args, **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'someClass'


class WhateverForm(BaseForm):
    class Meta:
        model = SomeModel

这有助于我自动将'form-control'类添加到我应用程序的所有形式的所有字段中,而无需添加代码复制。

这是在视图中改变的简单方法。在将其传递到模板之前,在视图中添加以下内容。

form = MyForm(instance = instance.obj)
form.fields['email'].widget.attrs = {'class':'here_class_name'}

只需将类添加到表单中,如下所示。

class UserLoginForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(
        attrs={
        'class':'form-control',
        'placeholder':'Username'
        }
    ))
    password = forms.CharField(widget=forms.PasswordInput(
        attrs={
        'class':'form-control',
        'placeholder':'Password'
        }
    ))

以上是上述内容的变体,它将为所有字段提供相同的类(例如jquery漂亮的圆角)。

  # Simple way to assign css class to every field
  def __init__(self, *args, **kwargs):
    super(TranslatedPageForm, self).__init__(*args, **kwargs)
    for myField in self.fields:
      self.fields[myField].widget.attrs['class'] = 'ui-state-default ui-corner-all'

如果您要将某个类添加到表单中的字段(不在view.py或form.py中),例如在您要修改第三方应用的情况下覆盖他们的观点,然后 Charlesthk 回答中描述的模板过滤器非常方便。但在此答案中,模板过滤器会覆盖该字段可能具有的任何现有类。

我尝试将其添加为编辑,但建议将其写为新答案。

因此,这是一个模板标记,它尊重该字段的现有类:

from django import template

register = template.Library()


@register.filter(name='addclass')
def addclass(field, given_class):
    existing_classes = field.field.widget.attrs.get('class', None)
    if existing_classes:
        if existing_classes.find(given_class) == -1:
            # if the given class doesn't exist in the existing classes
            classes = existing_classes + ' ' + given_class
        else:
            classes = existing_classes
    else:
        classes = given_class
    return field.as_widget(attrs={"class": classes})

你可以试试这个..

class SampleClass(forms.Form):
  name = forms.CharField(max_length=30)
  name.widget.attrs.update({'class': 'your-class'})
...

您可以在以下网址中查看更多信息: Django Widgets

事实证明,您可以在表单构造函数( init 函数)中或在启动表单类之后执行此操作。如果您没有编写自己的表单并且该表单来自其他地方,则有时需要这样做 -

def some_view(request):
    add_css_to_fields = ['list','of','fields']
    if request.method == 'POST':
        form = SomeForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/thanks/')
    else:
        form = SomeForm()

    for key in form.fields.keys():
        if key in add_css_to_fields:
            field = form.fields[key]
            css_addition = 'css_addition '
            css = field.widget.attrs.get('class', '')
            field.widget.attrs['class'] = css_addition + css_classes

    return render(request, 'template_name.html', {'form': form})

您还可以使用 Django Crispy Forms ,这是一个很棒的用于定义表单的工具,以便您使用某些CSS框架(如Bootstrap或Foundation)。并且很容易为那里的表单字段指定类。

您的表单类会这样:

from django import forms

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Submit, Field
from crispy_forms.bootstrap import FormActions

class SampleClass(forms.Form):
    name = forms.CharField(max_length=30)
    age = forms.IntegerField()
    django_hacker = forms.BooleanField(required=False)

    helper = FormHelper()
    helper.form_class = 'your-form-class'
    helper.layout = Layout(
        Field('name', css_class='name-class'),
        Field('age', css_class='age-class'),
        Field('django_hacker', css-class='hacker-class'),
        FormActions(
            Submit('save_changes', 'Save changes'),
        )
    )
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top