Форма Джанго с дополнительной информацией - PullRequest
1 голос
/ 25 марта 2012

У меня есть модель, в которой есть поля, которые нельзя редактировать, например, «дата создания».Я хочу отобразить форму, в которой есть несколько текстовых полей с дополнительной информацией, вероятно, только сами данные в <span>.Человек может редактировать несколько полей, и в то же время он может видеть дополнительную информацию об экземпляре модели, такую ​​как созданные, последние измененные или даже связанные объекты в базе данных для этого объекта.Есть ли способ сделать это, используя встроенные в Django фреймворки, или мне придется создавать собственную форму, передавая весь объект в шаблон?

Если вам нужно больше разъяснений, не стесняйтесь спрашивать.

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Лучший способ, которым я знаю, это инициализировать поля перед передачей формы в шаблон путем передачи словаря initial в форму или передачи объекта instance в форму.

Затем вы должны убедиться, что поля отключены, или вы должны сделать их скрытыми полями, а затем отобразить поля как обычный текст.

Самое главное, если вы передаете данные клиенту, который затемЧтобы быть отправленным обратно в форме, вы должны убедиться, что поступающие данные совпадают с поступившими данными (в целях безопасности).Сделайте это с помощью функции clean_[field] в форме.Это должно выглядеть следующим образом.

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def clean_date_created(self):
        if self.cleaned_fields['date_created'] != self.instance.date_created:
            raise ValidationError, 'date_created has been tampered'
        self.cleaned_fields['date_created']

[Edit / Addendum] В качестве альтернативы, вы можете передать данные непосредственно в шаблон для визуализации отдельно, а затем прикрепить данные к вашей форме после того, как вывернуть его на ваш взгляд.Это должно выглядеть примерно так:

def recieve_form(request, ...):
    ...
    f = MyForm(request.POST, instance=a)
    new_model_instance = f.save(commit=False)
    new_model_instance.date_created = <whatever>
    new_model_instance.save()
1 голос
/ 25 марта 2012

Для этого я обычно настраиваю форму для того, чтобы виджет был доступен только для чтения, например:

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'my_field': forms.TextInput(attrs={'disabled':'disabled'}),
        }

Это выведет текстовое поле только для чтения, но я думаю, вы также можете создатьВиджет, который будет просто выводить <div> или <p> (или все, что вам нужно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...