更新实例时Django表示字段初始值

时间:2018-03-01 12:42:40

标签: python django django-models django-forms

我有一个用于更新模型实例的自定义Django ModelForm 这是示例模型:

$('#image').offset().top + $('#image').height()

创建实例时,我只会传递class MyModel(models.Model): number = models.CharField(_("Number"), max_length=30, unique=True) sent_date = models.DateField(_('Sent date'), null=True, blank=True) 字段,这就是我不想要number的原因。

然后我有一个使用此自定义表单更新sent_date字段的视图:

sent_date

# Generic form updater class MyModelUpdateForm(forms.ModelForm): class Meta: model = MyModel fields = [] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Make fields mandatory if hasattr(self, 'required_fields'): for field_name in self.required_fields: self.fields[field_name].required = True # Set initial values if hasattr(self, 'initial_values'): for field_name, value in self.initial_values.items(): self.initial[field_name] = value class SentForm(MyModelUpdateForm): required_fields = ['sent_date'] initial_values = {'sent_date': datetime.date.today()} class Meta(MyModelUpdateForm.Meta): fields = ['sent_date'] field_classes = {'sent_date': MyCustomDateField} def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) MyModelUpdateForm等具体形式的通用祖先。

在我的视图中,只要有GET,我就用以下方法手动实例化表单:

SentForm

所以在这种情况下,我希望my_form = SentForm({instance: my_model_instance}) 字段的初始值设置为今天的日期,即使实际模型实例字段为None也很难。

如果我检查sent_date对象,它确实具有以下属性:

my_form

显然它应该有用,但它并不是:该字段总是空的。

所以我怀疑该值来自initial: {'sent_date': datetime.date(2018, 3, 1)} instance: my_model_instance fields: {'sent_date': ...: ..., 'initial': None # Why this is None? ...: ... } ,实际上是my_model_instance.sent_date

None是正确的。
在另一方initial['sent_date'] = datetime.date(2018, 3, 1),它不是。

fields['sent_date']['initial'] = None initial时,如何始终显示my_model_instance.sent_date值?

2 个答案:

答案 0 :(得分:0)

显然我已经解决了:

class MyModelUpdateForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = []

    def __init__(self, *args, **kwargs):
        initial = kwargs.get('initial', {})
        if hasattr(self, 'initial_values') and not kwargs.get('data'):
            for field_name, value in self.initial_values.items():
                if not getattr(kwargs.get('instance', None), field_name, None):
                    initial[field_name] = value
            kwargs.update({'initial': initial})
        super().__init__(*args, **kwargs)

        # Make fields mandatory
        if hasattr(self, 'required_fields'):
            for field_name in self.required_fields:
                self.fields[field_name].required = True

即使很难有效,如果有人有任何问题,我也不会介意那种 hackish 解决方案。)

答案 1 :(得分:0)

我的应用程序中的很多地方都有这种情况,没有任何问题。但是,我使用不同的方法来设置现有实例的某些字段的初始值。而不是:

self.initial[field_name] = value

我在打电话给super()之后写了:

self.fields[field_name].initial = value

你可以尝试告诉结果吗?