Динамически заполняемые выпадающие элементы в таблице с помощью Django

Я разработал небольшой интерфейс для списка проектов с Django. Каждый проект имеет несколько версий. Я хотел бы создать таблицу и в каждой строке я хотел бы иметь следующие элементы.

  1. Project Name
  2. Project Description
  3. A dropdown button to select the desired version
  4. A button to open that specific project and that specific version

У меня все в порядке с пунктами 1, 2 и 4, но мне трудно создать выпадающий список после запроса списка версий.

Это моя project.html

<table>
 <tr>
    <th>ID</th>
    <th>Name</th> 
    <th>Description</th> 
    <th>Version</th> 
 </tr>

 <!-- {% for project in projects %} -->
 <tr>
    <td>{{project.id}}</td>
    <td>{{project.projectName}}</td>
    <td>{{project.projectDescription}}</td>
    <td>Dropdown</td>
    <td><form action="{% url 'builder' project.id %}" method='GET'><button type='submit'>Open</button></form></td>
 </tr>
 <!-- {% endfor %} -->
</table>

Это моя model.py

class Project (models.Model):
    
    id = models.AutoField(primary_key=True)
    projectName = models.CharField(max_length=100)
    projectDescription = models.CharField(max_length=500)
    created_by = ForeignKey(User, on_delete=models.DO_NOTHING)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.projectName

class ProjectVersion (models.Model):
    id = models.AutoField(primary_key=True)
    versionNumber = models.IntegerField()
    versionName = models.CharField(max_length=100)
    project = models.ForeignKey(Project, on_delete=models.DO_NOTHING)
    versionDescription = models.TextField(default='')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        vName = self.project.projectName + " " + self.versionName
        return vName

и это мой views.py

class ProjectsList(TemplateView):

    template_name = "projects.html"

    def get(self, request, *args, **kwargs):
        context = self.get_context_data()
        return render(request, self.template_name, context)

    def get_context_data(self, **kwargs):
        context = super(ProjectsList, self).get_context_data(**kwargs)
        context['projects'] = get_objects_for_user(self.request.user, 'server.share_project')
        query_set = context['projects']
        versions = []
        for each in query_set:
            versions.append(ProjectVersion.objects.filter(project=each))
        context['versions'] = versions
        return context

В конечном итоге я буду вызывать API, который будет загружать определенный набор данных на основе Project и ProjectVersion.

Есть предложения, как к этому подойти?

Мне удалось это выяснить.

Итак, я изменил forms.py на

from django import forms
from .models import Project, ProjectVersion
from django.shortcuts import render

class VersionForm(forms.ModelForm):

    class Meta:
        model = ProjectVersion
        fields = ('versionName', )

    def __init__ (self, project, projectId, projectName, projectDescription, *args, **kwargs):
        super (VersionForm, self).__init__ (*args, **kwargs)
        self.project = project
        self.projectId = projectId
        self.projectName = projectName
        self.projectDescription = projectDescription
        queryset = ProjectVersion.objects.filter(project=project).order_by('-created_at')
        self.fields['versionName'] = forms.ModelChoiceField(queryset = queryset, label='', initial = queryset[0])

Затем я изменил свои views.py

    ...
    def get_context_data(self, **kwargs):
            context = super(ProjectsList, self).get_context_data(**kwargs)
            queryset = get_objects_for_user(self.request.user, 'server.share_project')
            context['versionforms'] = []
            for each in queryset:
                form = VersionForm(each, each.id, each.projectName, each.projectDescription)
                context['versionforms'].append(form)
            return context
    ...

и, наконец, обновил мой шаблон как

    ...
    <tr>
        <td>{{form.projectId}}</td>
        <td id={{form.projectName}}>{{form.projectName}}</td>
        <td id={{form.projectDescription}}>{{form.projectDescription}}</td>
        <td>{{form.versionName}}</td>
        <td><form action="{% url 'builder' form.projectId %}" method='GET'><button type='submit'>Open</button></form></td>
    </tr>
    ...
Вернуться на верх