2014-12-16 3 views
1

Я использую Django 1.7 с начальной загрузкой 3 и хочу сделать каждую полевую форму точно так же, лучше всего с использованием полех начальной загрузки имеет ошибки:Django шаблон визуализации каждого поля формы на основе критериев

<div class="form-group {% if form.field.errors %}has-error has-feedback{% endif %}"> 
    <label class="control-label" for="field">{{ form.field.help_text }}</label> 

    <div class="input-group"> 
     <span class="input-group-addon"><span class="some-icon"></span></span> 
     {% render_field form.field class+="form-control" placeholder=form.field.label id="end-date" aria-describedby="inputError2Status" %} 
    </div> 
    <label class="control-label" for="field">{{ form.field.errors.as_text }}</label> 
</div> 

Как вы можете см., в тот момент, когда число полей увеличивается, оно становится МНОГО работы, а не только для его написания, но и для его поддержания, а рефакторинг становится чертовски ... на самом деле НЕ СУХОЙ. Для каждого поля мне нужно изменить переменные form.field и id="field", а значок

Как написать функцию, templatetag или что-то еще, чтобы django отображал все поля в моей форме таким образом? Возможно ли это сделать? Было бы замечательно, если в форме в django была бы настройка, чтобы принять необязательный glypycon class, который рендеринг будет использовать для рендеринга значка.

- РЕДАКТИРОВАТЬ -

Как указано @Serafeim Джанго-хрустящими-форм может быть решением. Но как я могу использовать хрустящие формы для создания вышеуказанного html?

- EDIT 2 -

После прочтения на хрустящих форм мне удалось придумать следующее решение: Мой forms.py файл выглядит следующим образом:

class CreateForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(CreateForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_method = 'post' 
     self.helper.form_action = 'submit' 
     self.helper.add_input(Submit('submit', 'Submit')) 
     self.helper.html5_required = True 
     self.helper.layout = Layout(
      PrependedText('fieldA', '<span class="fa fa-calendar"></span>', placeholder="yyyy-mm-dd"), 
      PrependedText('fieldB', '<span class="fa fa-clock-o"></span>', placeholder="0:00:00 (h:m:s)"), 
     'fieldC') 

    fieldA = forms.DateField(required=True) 
    fieldB = FDurationField(required=True) 
    fieldC = forms.CharField(widget=forms.Textarea(attrs={'rows':3}), required=False, max_length=128) 

    class Meta: 
     model = AModel 
     exclude = ('fieldD', 'FieldE', 'fieldF', 'fieldG') 

и в мой шаблон мне нужно только позвонить {% crispy form %}, который намного лучше, чем моя первоначальная версия. Тем не менее, я все еще чувствую, что мне нужно повторить определенные шаги, например добавление полей в макет ... Возможно ли еще еще уменьшить код?

+0

Вы когда-нибудь слышали о джанго-хрустящих формах http://django-crispy-forms.readthedocs.org/en/latest/? Попробуйте, и он решит все ваши проблемы :) – Serafeim

+0

У меня есть, и я пробовал, но я не мог заставить его работать так, как я хотел ... Возможно, я просто не использовал его правильно. .. К сожалению, я не могу показать вам код, который у меня был с хрустящими формами, удалил его некоторое время назад :( – Tim

ответ

1

Было бы удивительным, если форма в Джанго будет иметь установку для принять дополнительный класс glypycon который рендерер будет использовать для визуализации значок.

Формы - это всего лишь коллекция полей. A Field представляет собой комбинацию widget (которая управляет обработкой HTML) и правилами проверки.

Чтобы управлять тем, что отображается на странице, вы должны изменить виджет.

Например, если я хочу, чтобы задать класс CSS или заполнитель, я хотел бы сделать это на уровне виджета:

email = forms.EmailField(label='Email Address', 
         required=False, 
         widget=forms.TextInput(attrs={'class': 'form-control', 
                 'placeholder': '[email protected]'})) 

Вы можете создавать свои собственные виджеты и поля и получить точный контроль над тем, как формы оказываются; поэтому то, что вы просите, абсолютно возможно; но поскольку это то, что часто повторяется, django-crispy-forms стал стандартным способом defacto для этого.

+0

Спасибо за информацию. Я не знал, что это параметр '' attrs'', который уже поможет Как я уже упоминал по моему (обновленному) вопросу. Можете ли вы привести пример того, что нужно сделать для визуализации полей, как в моем коде? – Tim

+0

Я обновил свой вопрос с помощью нового кода хрустящей формы. – Tim

Смежные вопросы