Я хочу отобразить текстовое значение внешнего ключа на шаблоне таким образом, чтобы пользователь не мог его изменить. Шаблон:
{% for form in formset %}
<div class="">
{% for field in form %}
{{ field }}
{% endfor %}
</div>
{% endfor %}
HTML рендер:
<select name="form-0-semestre_solicitacao" id="id_form-0-semestre_solicitacao">
<option value="">---------</option>
<option value="5">2020/1</option>
<option value="4">2019/2</option>
<option value="3" selected="">2019/1</option>
<option value="2">2018/2</option
<option value="1">2018/1</option>
</select>
Я пробовал {{ field.initial }} and {{ field.value }}
, но отображается 3, и я хотел бы, чтобы отображался текст: 2019/1
Обновление: отображаемое поле относится к внешнему ключу в semestre_solicitacao models.py
class Solicitacao(models.Model):
"""Solicitações, depende de User e curso"""
#TODO trocar homologada de boolean para choice homologada e não homologada, e ajustar forms
solicitante = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
disciplina = models.ForeignKey(Disciplina, on_delete=models.CASCADE)
justificativa = models.TextField(("Justificativa para o pedido"),
help_text="O candidato pode explicar os motivos para solicitar a prova, por exemplo: experiência profissional, cursos não regulares, aproveitamentos indeferidos, entre outros.", blank=True, null=True)
documentos = models.FileField(("Documentos comprobatorios de conhecimentos"),
upload_to=None, max_length=100, blank=True, null=True,
validators=[FileExtensionValidator(['.pdf'])])
data_solicitacao = models.DateTimeField(
("Data da solicitação"), auto_now_add=True)
cursou_anteriormente = models.BooleanField(
("Cursou anteriormente a disciplina solicitada"), blank=True, null=True)
homologada = models.BooleanField(blank=True, null=True)
semestre_solicitacao = models.ForeignKey(Calendario, on_delete=models.CASCADE, null=True)
Views.py
from extra_views import ModelFormSetView
class ItemFormSetView(ModelFormSetView):
model = Solicitacao
fields = ['semestre_solicitacao', 'solicitante', 'disciplina', 'cursou_anteriormente']
template_name = 'manage_solicitacoes.html'
success_url = reverse_lazy('cc:solicitacoes')
factory_kwargs = {'extra': 0}
def get_queryset(self):
slug = self.kwargs['slug']
return super(ItemFormSetView, self).get_queryset().filter(semestre_solicitacao__slug=slug)
Я использую django -extra- views.
Обновление 2: Я получаю верхнюю часть изображения, и мне хотелось бы что-то похожее на изображение внизу
Другие модели:
class Calendario(models.Model):
"""Calendario referente as datas do semestre"""
ano = models.CharField(
("Ano"), max_length=4,
help_text='Ano dos pedidos, ex: 2020')
semestre = models.CharField(
("Semestre"), max_length=1,
help_text='Semestre dos pedidos')
is_active = models.BooleanField('Calendário em vigor', default=True)
inicio_solicitacoes = models.DateField(
"Inicío das Solicitações", auto_now=False, auto_now_add=False)
fim_solicitacoes = models.DateField(
"Fim das Solicitações", auto_now=False, auto_now_add=False)
inicio_recursos = models.DateField(
"Inicío dos Recursos", auto_now=False, auto_now_add=False)
fim_recursos = models.DateField(
"Fim dos Recursos", auto_now=False, auto_now_add=False)
slug = models.SlugField(unique=True)
class Meta():
ordering = ['-ano', '-semestre']
constraints = [
models.UniqueConstraint(
fields=['ano', 'semestre'], name='unique_ano_semestre')
]
def __str__(self):
return f'{self.ano}/{self.semestre}'
def get_absolute_url(self):
return reverse("calendario:calendario-detail", kwargs={"slug": self.slug})
def get_delete_url(self):
return reverse("calendario:calendario-delete", kwargs={"slug": self.slug})
def save(self, *args, **kwargs):
"""Garante que exista apenas um is_active=True e define a slug"""
slug_str = f'{self.ano}-{self.semestre}'
unique_slugify(self, slug_str)
if self.is_active:
with transaction.atomic():
Calendario.objects.filter(
is_active=True).update(is_active=False)
return super(Calendario, self).save(*args, **kwargs)
else:
return super(Calendario, self).save(*args, **kwargs)
def get_fields(self):
""" Permite usar for no template para exibir todos os atributos do objeto"""
return [(field.verbose_name, field.value_to_string(self)) for field in Calendario._meta.fields]
class Curso(models.Model):
"""Cursos existente e ativos com matriz"""
nome = models.CharField(max_length=30)
abreviacao = models.CharField(
'Abreviação', max_length=3, help_text='Máximo 3 letras')
matriz = models.CharField(
max_length=4, help_text='Ano de aprovação de matriz do curso')
is_active = models.BooleanField('Ativo', default=True)
slug = models.SlugField(max_length=20)
class Meta():
ordering = ['-is_active', 'nome']
def save(self, *args, **kwargs):
slug_str = self.abreviacao + self.matriz
unique_slugify(self, slug_str)
self.abreviacao = self.abreviacao.upper()
super(Curso, self).save(*args, **kwargs)
def __str__(self):
return f'{self.abreviacao}/{self.matriz}'
def get_absolute_url(self):
return reverse("curso:curso-detail", kwargs={"slug": self.slug})
class Disciplina(models.Model):
"""Modelo disciplina"""
codigo = models.CharField(("Código"), max_length=12, primary_key=True, unique=True)
nome = models.CharField(("Nome da disciplina"), max_length=50)
curso = models.ManyToManyField('Curso')
def __str__(self):
return f'{self.codigo} - {self.nome}'
def get_absolute_url(self):
"""Url para o template com detalhes de uma disciplinas especifica"""
return reverse("curso:disciplina-detail", kwargs={"pk": self.codigo})