2016-08-09 5 views
0

У меня есть модель с некоторыми полями. Рассмотрим приведенную ниже модель.Только значение поля отображения из формы класса в Django

class Item(models.Model): 
    a = models.CharField(max_length=200) 
    b = models.BooleanField(default=False) 
    c = models.CharField(max_length=200) 

Класс формы для соответствующей модели.

class ItemForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    class Meta: 
     model = Item 
     localized_fields = '__all__' 
     fields = [ 
      'a', 
      'b', 
      'c', 
     ] 

И вид для формы. Класс вида использует шаблон, который отображает все поля. Но поле c будет отображаться только в том случае, если Поле b - это правда.

{% if form.b.value %} 
    {% form.c %} 
{% endif %} 

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

Вопрос заключается в том, что если я использую if условие в шаблоне (Предположим, что b ложно), когда я загружаю форму он показывает 2 поля a и b и когда я отправить форму с b значение ИСТИНА, форма перезагружается без сохранение всех трех полей со значением Поле c как пустое.

Поле c уже имеет значение и оно присутствует в БД, но оно не отображается. Почему это?

EDIT: Вот мой взгляд, довольно просто

class ItemGeneral(UpdateView): 
    form_class = ItemUpdateForm 
    template_name = 'pretixcontrol/item/index.html' 
    permission = 'can_change_items' 

    @transaction.atomic() 
    def form_valid(self, form): 
     # some code 
     return super().form_valid(form) 
+0

Вы можете попытаться установить Ĉ read_only вместо не редактируется? Так ли это работает? –

ответ

1

Чтобы c не-редактируемые, я бы использовать Field.disabled атрибут нового в Django 1.9. Увидеть этот пост для получения информации о том, как использовать его, и что делать, если вы в 1.8 или старше:

In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

Что касается вопроса экономии, то я должен был бы видеть ваше мнение, чтобы убедиться, но похоже, что во время проверки формы что-то может пойти наперекосяк. Ваша форма будет ожидать все три поля, поскольку это то, как она инициализирована, но ваш шаблон может удалить поле, не зависящее от логики представления. Возможно, проблема возникает, когда только два из трех ожидаемых полей проходят через form.is_valid()?

Было бы приемлемо, чтобы c всегда отображался в источнике страницы? Вы можете отобразить форму обычно во всех случаях, затем проверить значение поля b с использованием jQuery/JS и условно .hide.

В качестве альтернативы, вы можете проверить атрибуты вашей модели в представлении и условно remove a field from the form's self.fields dict или override the init method.

+0

Это похоже на хороший подход, использование JS было бы хорошим способом прослушать изменения в поле 'b', а затем переключить оба поля' c' в соответствии со значением поля 'b'. Вы можете добавлять атрибуты в поля с помощью [form.widgets] (https://docs.djangoproject.com/en/1.10/ref/forms/widgets/#widget) и устанавливать атрибут для чтения. – kt14

+0

'Field.disabled' сделал трюк. Я не знаю, как я это пропустил. Благодаря! :) – JRodDynamite