Форма 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>
Вернуться на верх