首页 > 解决方案 > Django:在组合框中显示来自外键模型的值并选择它

问题描述

所以我有以下要求:我需要在 Django 的组合框中显示一个值,即Project Description具体来说,但我只是想不出正确的方法来渲染它,因为我什么也没看到。这是我的配置:

模型.py

class Project(models.Model):
    projectID = models.AutoField(primary_key=True, db_column="Id", db_index=True, verbose_name='Project ID')
    description = models.CharField(max_length=900)

    def __str__(self):
        return str(f'{self.projectID}, {self.description}')

    def get_description(self):
        return str(self.description)

class PM(models.Model):
    PMid = models.AutoField(primary_key=True, db_column="Id", db_index=True)
    PMNumber = models.CharField(max_length=50, unique=True, db_column="PMNumber")
    description = models.CharField(max_length=600)
    projectId = models.ForeignKey(Project, on_delete=models.CASCADE,
                                  db_column="ProjectID", related_name='+')

    def __str__(self):
        return str(f'{self.PMid}, {self.PMNumber}, {self.description}')

    def get_project_description(self):
        Project.objects.all().values_list('projectID', 'description')

这些是表格:

表格.py

""" PM Forms """
#Django imports
from django import forms
#Project imports
from pm.models import PM

class PMForm(forms.ModelForm):
    """PMForm"""

    class Meta:
        model = PM
        fields = ('PMNumber', 'description', 'projectId')

这是观点:

视图.py

"""Pm Views """
#Django imports
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView 
#Forms import
from pm.forms import PMForm
#Models import

class CreatePMView(LoginRequiredMixin, CreateView):
    template_name = 'pm/new.html'
    form_class = PMForm
    success_url = reverse_lazy('project:feed')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['user'] = self.request.user

        return context
    def get_description(self):
        return self.request.project.description

这是我试图渲染以显示的 HTML,Project description但我什么也没看到

                     <div class="form-group col-md-4" >
                        <label for="project">Project</label>
                        <select id="project" class="form-control" name = "projectId" placeholder="Project related">
                        <option selected>Choose...</option>
                        <option>
                            {% for project in form.projectId %}
                                {{ project.projectId.description }}
                            {% endfor %}
                        </option>
                         </select>
                     </div>

标签: djangopython-3.xdjango-modelsdjango-viewsdjango-templates

解决方案


那这个呢:

"""Pm Views """
#Django imports
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView 
#Forms import
from pm.forms import PMForm
#Models import

class CreatePMView(LoginRequiredMixin, CreateView):
    template_name = 'pm/new.html'
    form_class = PMForm
    success_url = reverse_lazy('project:feed')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['user'] = self.request.user
        context['projects'] = Project.objects.all() # Add projects to context

        return context
    def get_description(self):
        return self.request.project.description

然后

<div class="form-group col-md-4" >
<label for="project">Project</label>
<select id="project" class="form-control" name = "projectId" placeholder="Project related">
{% for project in projects %}
{% if project.description == "MyProject" %}
   <option value={{project.projectID}} selected>{{project.description}}</option>
{% else %}
   <option value={{project.projectID}}>{{project.description}}</option>
{% endif %}
{% endfor %}
</select>
</div>

推荐阅读