Django: отобразить значение из модели внешнего ключа в поле со списком и выбрать его - PullRequest
0 голосов
/ 15 апреля 2020

Итак, у меня есть следующее требование: мне нужно отобразить значение из поля со списком в Django, в частности, Project Description, но я просто не могу понять, как правильно отобразить его, как я вижу ничего. Вот моя конфигурация:

models.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')

Это формы:

forms.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')

И это вид :

views.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>

1 Ответ

0 голосов
/ 15 апреля 2020

что по этому поводу:

"""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>
...