У меня есть форма на моем сайте. Форма создается с помощью цикла 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}}






Вы можете получить доступ к словарю 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, который можно использовать для объяснения поля.
Я оставил 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".
Решение verbose_name не сработало, но я просмотрел предоставленный вами текст справки, и стратегия «ярлыков» сработала. Спасибо за ссылку.