Как в формах Python Django присвоить полю формы «второе имя»?

У меня есть форма на моем сайте. Форма создается с помощью цикла Python, который вызывает поля по имени их переменной. Вот HTML-код:

{% csrf_token %}
  {% for form_field in task_form %}
    <div class = "wrap-input2 validate-input" data-validate = "Name is required">
      <input class = "input2" type = "text" name = "{{ form_field.name }}">
      <span class = "focus-input2" data-placeholder = "{{ form_field.name }}"></span>
    </div>
  {% endfor %}

Переменная {{form_field.name}} отображается на веб-сайте для каждого поля, но это грубая версия того, что я хотел бы отображать. Вот как создаются поля в коде Python:

class Task(models.Model):
  name = models.CharField(max_length=200,default = 'Untitled task ',blank=True,)
  description = models.TextField(null=True,blank=True)
  cost = models.DecimalField(max_digits=19,decimal_places=2,null=True,blank=True,default=0)
  profit = models.DecimalField(max_digits=19,decimal_places=2,null=True,blank=True,default=0)
  start_date = models.DateField(null=True,blank=True)
  end_date = models.DateField(null=True,blank=True)
  hours_to_finish = models.IntegerField(null=True,blank=True,default=0)
  hours_finished = models.IntegerField(null=True,blank=True,default=0)
  project= models.ForeignKey(Project,on_delete=models.CASCADE)
  parent_task = models.ForeignKey('self', on_delete= models.SET_NULL ,null=True,blank = True)
  def __str__(self):
    return self.name

есть ли способ вызвать поле формы с его именем, но иметь отдельную переменную, привязанную к каждому полю, которое я мог бы вызвать для отображения на сайте, например {{form_field.nickname}}

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
132
3

Ответы 3

Вы можете получить доступ к словарю fields в своей форме, поэтому обращайтесь к своим полям как:

<div class = "wrap-input2 validate-input" data-validate = "Name is required">
  <input class = "input2" type = "text" name = "{{ form.fields.project.name }}">
  <span class = "focus-input2" data-placeholder = "{{ form.fields.project.name }}"></span>
</div>

Вы ищете атрибут Field.label.

Если вы создаете Form из модели, атрибут verbose_name поля модели используется как метка для поля формы (как описано в типовая форма документов).

class Task(models.Model):
    ...
    start_date = models.DateField(null=True,blank=True, verbose_name = "Date started")
    ...


{% csrf_token %}
  {% for form_field in task_form %}
    <div class = "wrap-input2 validate-input" data-validate = "Name is required">
      <input class = "input2" type = "text" name = "{{ form_field.name }}">
      <span class = "focus-input2" data-placeholder = "{{ form_field.verbose_name }}"></span>
    </div>
  {% endfor %}

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

Обратите внимание, что есть также help_text, который можно использовать для объяснения поля.

Решение verbose_name не сработало, но я просмотрел предоставленный вами текст справки, и стратегия «ярлыков» сработала. Спасибо за ссылку.

ADAM KOZIAK 10.01.2019 22:18

Я оставил models.py в покое, но в forms.py я добавил это в мета-класс каждой формы:

fields = ('name', 'description', 'cost', 'profit', 'start_date', 'end_date', 'hours_to_finish', 'hours_finished', 'project', 'parent_task')
    labels = {
        'name': ('Task Name'),
        'description': ('Description'),
        'cost': ('Cost'),
        'profit': ('Profit'),
        'start_date': ('Start Date'),
        'end_date': ('End Date'),
        'hours_to_finish': ('Hours Remaining'),
        'hours_finished': ('Hours Completed'),
        'project': ('Parent Project'),
        'parent_task': ('Parent Task'),
    }

просто примените имена полей к вашей форме, и имена в скобках будут отображаться с использованием {{form_field.label}} вместо {{form_field.name}}

Я назвал это в HTML так:

{% csrf_token %}
        {% for form_field in task_form %}
        <div class = "wrap-input2 validate-input" data-validate = "Name is required">
          <input class = "input2" type = "text" name = "{{ form_field.name }}">
          <span class = "focus-input2" data-placeholder = "{{ form_field.label }}"></span>
        </div>
        {% endfor %}

Обязательно включите все поля, которые вы хотите переименовать, в массив "fields".

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