我有这个型号:
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”实现这一目标的方式?
答案 0 :(得分:0)
一种方法是保留原始<select>
小部件的HTML outpot,并仅使用您的JavaScript代码隐藏/替换它。每当用户更改您精美小部件中的选择时,都应相应地更改基础<select>
。
通过这种方式,您可以免费获得优雅的降级,并且它可以独立于任何底层后端运行。如果我没弄错的话,Django管理员中的filter_{horizontal,vertical}
小部件会以这种方式工作;也许你可以look at the widget code获得灵感。
答案 1 :(得分:0)
您似乎无法对表单的功能进行实质性更改。您提到的大多数更改都发生在模板或表示层。 Django在模型,视图和模板之间保持清晰的分离。因此,使用ModelForms并进行必要的修改没有任何问题。