将类添加到django表单小部件字段

时间:2012-01-24 14:59:02

标签: jquery css django django-forms

我有两种模式:

class Studio(models.Model):
    name = models.CharField("Studio", max_length=30, unique=True)

class Film(models.Model):
    studio = models.ForeignKey(Studio, verbose_name="Studio")
    name = models.CharField("Film Name", max_length=30, unique=True)

我想为电影创建一个表单。表单应该包含Studio的下拉列表,但如果他们需要的表单不在数据库中,则允许用户输入新的Studio。 首先,如果有更简单的方法来实现这一点,请告诉我。

但我要做的是在Studio下拉列表旁边添加一个“+”图标。如果单击此按钮,则会取消隐藏允许用户输入新Studio文本的新字段。我想在unhid字段旁边添加一个“ - ”按钮,如果用户改变主意,它会重新隐藏它。那就是我被困住的地方。

我的表单目前看起来像这样:

class SelectWithPlus(forms.Select):
    def render(self, name, *args, **kwargs):
        html = super(SelectWithPlus, self).render(name, *args, **kwargs)
        plus = render_to_string("form/plus.html", {'field': name})
        return html+plus

class DeSelectWithX(forms.CharField):
    def render(self, name, *args, **kwargs):
        html = super(DeSelectWithX, self).render(name, *args, **kwargs)
        ex = render_to_string("form/ex.html", {'field': name})
        return html+ex

class FilmForm(forms.Form):
    required_css_class = 'required'
    studio = forms.ModelChoiceField(Studio.objects, widget = SelectWithPlus)
    new_studio = forms.CharField(max_length=30, required=False, label = "New Studio Name", widget = DeSelectWithX)
    name = forms.CharField(max_length=30, label = "Film Name")

    def __init__(self, *args, **kwargs):
        super(MdlForm, self).__init__(*args,**kwargs)
        self.fields['new_studio'].widget.attrs['class'] = 'hidden_studio_field'

这个想法是工作室字段有一个小部件,为“+”图标添加了一些html:

<a
    href="JavaScript:void()"
    class="add-another"
    id="add_id_{{ field }}">
    <img src="http://mydbupload.s3.amazonaws.com/icon_addlink.gif" width="10" height="10" Border ="0" alt="Add New {{ field }}"/>
</a>

单击此按钮时,会触发jquery以显示正确命名的字段:

<script type="text/javascript">
    $(document).ready(function() {
        $(".hidden_studio_field").hide();
        $('label[for="id_new_studio"]').hide();
    });

    $(function () {
        $('#add_id_studio').click(function() {
            $(".hidden_studio_field").show();
            $('label[for="id_new_studio"]').show();
        });
    });
</script>

所以我想在new_studio字段中添加一个类似的“ - ”按钮。我试图复制SelectWithPlus小部件,但我遇到的一个障碍是我不能再使用将该类“hidden_​​studio_field”添加到该字段的代码。我收到一个错误:'DeSelectWithX'对象没有属性'attrs'

如此简短的问题:如何将css类型的类添加到由窗口小部件定义的字段中?

1 个答案:

答案 0 :(得分:0)

DeSelectWithX应该继承自forms.TextInput,而不是forms.CharField