【问题标题】:Change default widgets of Django to custom ones将 Django 的默认小部件更改为自定义小部件
【发布时间】:2015-04-14 08:21:55
【问题描述】:

我的用例:我想使用不同的 DateInput。但我想减少代码重复。我希望所有不明确需要不同 DateInput 小部件的表单都使用我的自定义小部件。

在不打猴子补丁的情况下有什么改变可以解决这个问题吗?

例子

models.py:

class MyModel(models.Model):
    date=models.DateField()

forms.py:

class MyForm(forms.ModelForm):
    class Meta:
        model=MyModel

上面的代码应该使用我的自定义小部件。上面的models.py和forms.py我不想改,因为太多了。

【问题讨论】:

  • 看看django-floppyforms。如果您不使用应用程序本身,您至少可以从他们的处理方式中获得一些灵感。

标签: django forms monkeypatching


【解决方案1】:
  1. 创建您的字段
  2. 创建默认使用该字段的表单
  3. 使用时导入此表单而不是默认表单

如果您在管理员中使用它:

  1. 创建您自己的 ModelAdmin,默认使用您的表单
  2. 使用它而不是默认的 ModelAdmin。

【讨论】:

  • 非常感谢您的回答。您的回答说明了如何使用自定义小部件。我想在不修改代码的情况下在任何地方使用自定义小部件。我想更改 django 本身的默认值。
  • 所以我认为没有猴子补丁是不可能的
【解决方案2】:

很遗憾,我认为您无法使用上面列出的确切代码来完成此操作。

如果没有 hacking django,基本上有两个部分。第一个是创建自定义表单字段,第二个是将自定义模型字段默认为新创建的表单字段。

要创建自定义表单字段,您可以覆盖现有的 django forms.DateField 并更新小部件。

# form_fields.py
from django.forms import DateField
from myapp.widgets import MyWidget

class MyDateFormField(DateField):
    widget = MyWidget

然后在您创建表单字段后,您将不得不覆盖 django 模型字段以默认为您的新表单字段

# fields.py
from django.db.models import DateField
from myapp.form_fields import MyDateFormField

class MyDateField(MyDateFormField):
    def formfield(self, **kwargs):
        defaults = {'form_class': MyDateFormField}
        defaults.update(kwargs)
        return super(DateField, self).formfield(**defaults)

然后您将拥有自定义模型字段,您需要稍微更改您的代码才能使用。

from myapp.fields import MyDateField

class MyModel(models.Model):
    date=MyDateField()

这并不完全符合您的要求(必须更改模型字段),但希望这能让您朝着正确的方向前进。

【讨论】:

  • 您的第一句话回答了我的问题:“不幸的是,我认为您无法使用上面列出的确切代码来完成此操作。”。第一行之后的行是另一个问题的答案。我想它会帮助一些人。谢谢你。 (简短的回答:没有猴子补丁是不可能的)。
  • 我目前正在从事同样的任务,请您进一步详细说明“默认您的自定义模型字段”。我不能通过覆盖 django.db.models.Model 类来更改默认字段吗?
猜你喜欢
  • 2012-04-11
  • 2017-01-23
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2023-03-16
相关资源
最近更新 更多