在DJango 1.6和crispy表单中,我在一个名为last_modified_by
的model.py中有字段。我有一个表单,用户可以修改模型的对象...但我不希望他们能够修改last_modified_by
字段。出于某种原因,如果我不公开显示此字段,则提交后表单/对象将不会保存。没有错误....页面只是刷新,因为它不成功。如果我在表单上公开显示last_modified_by
,则表单会保存而不会出现任何问题。
这是代码的缩写,精简版本(我省略了其他字段以使其更具可读性)
class ModifyForm(CreateForm):
date_completed = forms.DateTimeField(
widget=DateTimePicker(options={"format": "YYYY-MM-DD HH:mm",
"pickTime": True}))
class Meta:
model = Request
exclude = ('emails_sent',)
def __init__(self, *args, **kwargs):
super(ModifyForm, self).__init__(*args, **kwargs)
#even though this field is marked
#not required, this widget makes it...so:
self.fields['date_completed'].required = False
self.helper.layout = Layout(
Fieldset(
....
),
FormActions(
Submit('submit', 'Submit', css_class='btn-primary')
)
)
def get_date_if_not_Set(self):
if not self.fields['date_completed']:
self.fields['date_completed'] = datetime.datetime.now(pytz.utc)
self.save()
#This is needed because a person won't be able to submit a modified form
#with a previous date already set
def clean_date_due(self):
date = self.cleaned_data['date_due']
return date
def set_last_modify_by(self):
self.last_modified_by = user.pk
self.save()
models.py:
class Request(models.Model):
...
last_modified_by = models.ForeignKey(settings.AUTH_USER_MODEL,
related_name='user_last_modified', default=None,
null=True)
答案 0 :(得分:1)
在模型上,您需要将last_modified_by
设置为blank=True
。这相当于required=False
class Request(models.Model):
...
last_modified_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='user_last_modified',
blank=True,
null=True,
)
如果没有blank=True
,则该字段为required
,并且由于您的表单没有可见的last_modified_by
输入,它会将None
传递给模型。这是无效的。
完成后,您应该很高兴,但为什么不将last_modified_by
添加到表单exclude
列表中。
<强> date_completed 强>
我们无法看到您的模型,但是date_completed
是否blank=True
,您可以通过重新声明字段来覆盖表单。表单字段默认为必填,因此您需要设置为required=False
class ModifyForm(CreateForm):
date_completed = forms.DateTimeField(
required=False,
widget=DateTimePicker(
options={
"format": "YYYY-MM-DD HH:mm",
"pickTime": True,
}
)
)
最后你的clean_date_due
只传递了值,所以不需要(在当前状态下,你当然可以简化为SO)
答案 1 :(得分:1)
我认为,您需要将last_modified_by
添加到exclude
列表中。函数set_last_modify_by
也不起作用,因为那里user
未定义。