Форма Django не будет сохранена, если поле не отображается
В DJango 1.6 и хрустящих формах у меня есть поле в model.py, которое называется last_modified_by
, У меня есть форма, в которой пользователь может изменить объект модели... но я не хочу, чтобы он мог изменять 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)
2 ответа
Я думаю, вам нужно добавить last_modified_by
к exclude
список. Также функция set_last_modify_by
не будет работать, потому что user
там не определено.
На модель вам нужно установить 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)