Динамически заполняемые выпадающие элементы в таблице с помощью Django
Я разработал небольшой интерфейс для списка проектов с Django. Каждый проект имеет несколько версий. Я хотел бы создать таблицу и в каждой строке я хотел бы иметь следующие элементы.
- Project Name
- Project Description
- A dropdown button to select the desired version
- 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>
...