Форма 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)

Другие вопросы по тегам