Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Django的默认窗口小部件更改为自定义窗口小部件_Django_Forms_Monkeypatching - Fatal编程技术网

将Django的默认窗口小部件更改为自定义窗口小部件

将Django的默认窗口小部件更改为自定义窗口小部件,django,forms,monkeypatching,Django,Forms,Monkeypatching,我的用例:我想使用不同的DateInput。但我想减少代码重复。我希望所有的表单都能使用我的自定义小部件,这些表单并不需要一个不同的DateInput小部件 在不进行修补的情况下,有什么改变可以解决这个问题吗 范例 models.py: class MyModel(models.Model): date=models.DateField() forms.py: class MyForm(forms.ModelForm): class Meta: model=My

我的用例:我想使用不同的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,因为有很多

  • 创建您的字段
  • 创建默认情况下将使用此字段的表单
  • 使用此表单时,请导入此表单而不是默认表单
  • 如果您在管理中使用它:

  • 创建您自己的ModelAdmin,默认情况下将使用您的表单
  • 使用它而不是默认的ModelAdmin

  • 不幸的是,我认为您无法使用上面列出的确切代码来实现这一点

    在不攻击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本身的默认值。因此,我认为如果没有猴子补丁,这是不可能的。您的第一句话回答了我的问题:“不幸的是,我认为您无法使用上面列出的确切代码来实现此功能。”。第一行后面的几行是另一个问题的答案。我想这会帮助一些人。非常感谢。(简短回答:如果没有猴子补丁,这是不可能的)。我目前受雇于这项相同的任务,请您进一步详细说明“默认您的自定义模型字段”。我不能通过重写django.db.models.Model类来更改默认字段吗?