Django:自定义ModelForms的显示行为

时间:2014-01-16 01:34:34

标签: django django-crispy-forms

我有这个型号:

class DistList(models.Model):
    name = models.CharField(max_length=200, unique=True)
    description = models.TextField(blank=True, null=True)
    is_private = models.BooleanField(default=True)  
    members = models.ManyToManyField(User, blank=True, null=True)

我有这个ModelForm(使用crispy-forms)

class DistListForm(ModelForm):
    class Meta:
        model = DistList
        fields = ['name', 'description', 'members', 'is_private']

    def __init__(self, *args, **kwargs):
        super(DistListForm, self).__init__(*args, **kwargs)    
        self.helper = FormHelper(self)   
        self.helper.add_input(Submit('submit', 'Submit'))
        self.helper.layout = Layout(
                Field('name', css_class='form-control'),
                Field('description', css_class='form-control'),
                Field('members',css_class='form-control'),
         )
        self.fields['is_private'].label = 'Private Distribution List'

我想要做的是将渲染的多选项更改为github用于将用户添加到repos的内容。在ul下方有一个输入框,用户输入用户名,点击添加,新用户在ul上动态添加为li。我很喜欢它的javascript / jquery方面,但似乎ModelForms并不意味着像这样修改。

我认为我的问题更具概念性或最佳实践。如果我想大幅改变ModelForm的行为,最好只是制作一个Form并以这种方式处理它?什么是“Djangoest”实现这一目标的方式?

2 个答案:

答案 0 :(得分:0)

一种方法是保留原始<select>小部件的HTML outpot,并仅使用您的JavaScript代码隐藏/替换它。每当用户更改您精美小部件中的选择时,都应相应地更改基础<select>

通过这种方式,您可以免费获得优雅的降级,并且它可以独立于任何底层后端运行。如果我没弄错的话,Django管理员中的filter_{horizontal,vertical}小部件会以这种方式工作;也许你可以look at the widget code获得灵感。

答案 1 :(得分:0)

您似乎无法对表单的功能进行实质性更改。您提到的大多数更改都发生在模板或表示层。 Django在模型,视图和模板之间保持清晰的分离。因此,使用ModelForms并进行必要的修改没有任何问题。