Django: визуализировать поле формы как редактируемое текстовое поле только один раз и только для чтения после - PullRequest
1 голос
/ 12 ноября 2010

У меня есть типичный профиль / форма настроек аккаунта. Как и ожидалось, у вас будет поле «имя» и поле «домен» (которое будет использоваться как URL-адрес веб-сайта: maddy.mywebsite.com). Это поле домена необходимо редактировать только один раз. После установки на одну вещь позже не будет редактироваться (так как это похоже на URL сайта).

На уровне модели я сравниваю create_on и updated_on этого объекта (userprofile) и проверяю сохранение значения «домен». Но на уровне формы, как я могу настроить рендеринг только этого поля в соответствии с принятым мною условием?

Примечание 1. Я не хочу перемещать поле «домен» на страницу регистрации.

Примечание 2. Я пытаюсь использовать обычные формы (django.forms), а не ModelForm.

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Это выглядит сложно, вы можете прочитать некоторые из следующих идей:

В форме Django как сделать поле доступным только для чтения (или отключенным), чтобы его нельзя было редактировать?

http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.html

Ничто из этого не является особенно простым, поэтому я бы предложил (как и @dcrodjer):

Создание двух форм, одна для создания, другая для редактирования. В форме редактирования удалите поле Домен, чтобы оно не было обязательным / не было сохранено:

# forms.py

class AddForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('name','domain',)  

class EditForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('name',)  

По вашему мнению, создавая соответствующую форму, а в вашем шаблоне отображая различные HTML в зависимости от того, какую форму вы получили:

{% if form.domain %}
    {{form.domain.label_tag}}: {{form.domain}} {{form.domain.errors}}
{% else %}
    Domain: <input type="text" disabled="disabled" value="{{userprofile.domain}}"/>
{% endif %}
1 голос
/ 12 ноября 2010

Вы можете попробовать использовать два htmls, один для создания профиля и один для редактирования профиля. Визуализируйте полную форму в профиле создания, и для редактирования профиля, если вы используете тот же django, вы можете отключить поля #id_name и #id_domain, используя css или javascript. Реализация с использованием js:

    <script type="text/javascript"> 
        var domain = document.getElementById("id_domain");
        var name = document.getElementById("id_name");
        domain.value = "{{ domain }}";
        name.value = "{{ name }}";
        domain.readOnly = true;        
    </script>
...