我有一个用于更新模型实例的自定义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
值?
答案 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
你可以尝试告诉结果吗?