【问题标题】:Django: Customizing Display Behavior of ModelFormsDjango:自定义 ModelForms 的显示行为
【发布时间】:2014-01-16 01:34:33
【问题描述】:

我有这个模型:

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(使用清晰的表单)

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下面有一个输入框,用户输入用户名,点击add,新用户就会动态添加为ul上的li。我对它的 javascript/jquery 方面很满意,但似乎 ModelForms 不应该像这样修改。

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

【问题讨论】:

    标签: django django-crispy-forms


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-11
        • 2011-10-25
        • 2013-12-08
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2011-09-10
        • 1970-01-01
        相关资源
        最近更新 更多