Форма Django - показывать только чекбоксы со значениями True
На этом изображении показано, как в настоящее время отображаются все 'теги' - True или False. браузерное представление флажков
Я пытаюсь найти простой способ отображения флажков только для тех "тегов", значение которых равно true.
Могу ли я добавить оператор 'if' к этому коду в forms.py (например, в мета виджетах или в CheckboxSelectMultiple()) ?
class ProjectForm(ModelForm):
class Meta:
model = Project
fields = ['title', 'featured_image', 'description', 'demo_link', 'source_link', 'tags']
widgets = {
'tags': forms.CheckboxSelectMultiple(),
}
def __init__(self, *args, **kwargs):
super(ProjectForm, self).__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs.update({'class': 'input'})
Класс Project (модель), лежащий в основе ProjectForm, хранит только "истинные" метки в отношениях "многие-ко-многим". См. изображение sqlite, показывающее, что с каждым Проектом хранятся только Метки/Чекбоксы с "истинным" значением: view of sqlite database tables
Форма ProjectForm (показанная выше) используется для создания или обновления одного проекта и поэтому отображает поля только для этого проекта. Однако виджет, содержащий флажки, отображает флажки, используемые всеми проектами (а не только конкретным проектом, который создается/редактируется).
HTML шаблон Form выглядит следующим образом:
<form class="form" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<!-- Input:Text -->
<div class="form__field">
<label for="formInput#text">{{field.label}}</label>
{{field}}
</div>
{% endfor %}
etc.etc........
Вот базовый класс проекта (модель):
class Project(models.Model):
owner = models.ForeignKey(Profile, null=True, blank=True, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
description = models.TextField(null=True, blank=True)
featured_image = models.ImageField(null=True, blank=True, default="default.jpg")
demo_link = models.CharField(max_length=2000, null=True, blank=True)
source_link = models.CharField(max_length=2000, null=True, blank=True)
tags = models.ManyToManyField('Tag', blank=True)
vote_total = models.IntegerField(default=0, null=True, blank=True)
vote_ratio = models.IntegerField(default=0, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
def __str__(self):
return self.title
class Meta:
# ordering = ['-created']
ordering = ['-created', '-vote_ratio', 'vote_total', 'title']
Представление, использующее ProjectForm и отображающее html-шаблон при создании проекта, выглядит следующим образом:
def createProject(request):
profile = request.user.profile
form = ProjectForm()
if request.method == 'POST':
newtags = request.POST.get('newtags').replace(',', " ").split()
form = ProjectForm(request.POST, request.FILES)
if form.is_valid():
project = form.save(commit=False)
project.owner = profile
project.save()
for tag in newtags:
tag, created = Tag.objects.get_or_create(name=tag)
project.tags.add(tag)
return redirect('account')
context = {'form': form}
return render(request, 'projects/project_form.html', context)
Код представления для обновления проекта выглядит следующим образом (отображается тот же html шаблон, что и при создании проекта):
def updateProject(request, pk):
profile = request.user.profile
project = profile.project_set.get(id=pk)
form = ProjectForm(instance=project)
if request.method == 'POST':
newtags = request.POST.get('newtags').replace(',', " ").split()
form = ProjectForm(request.POST, request.FILES, instance=project)
if form.is_valid():
project = form.save()
for tag in newtags:
tag, created = Tag.objects.get_or_create(name=tag)
project.tags.add(tag)
return redirect('account')
context = {'form': form, 'project': project}
return render(request, 'projects/project_form.html', context)
Спасибо!
В вашем шаблоне вы можете отобразить значение, только если оно истинно
<form class="form" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
{% if field.field.widget.input_type == 'checkbox' %}
{% if field.value %}
<!-- Input:Text -->
<div class="form__field">
<label for="formInput#text">{{field.label}}</label>
{{field}}
</div>
{% endif %}
{% endif %}
{% endfor %}
</form>