【问题标题】:Django: Display a value from a foreign key model in a combo box and select itDjango:在组合框中显示来自外键模型的值并选择它
【发布时间】:2020-07-27 18:55:26
【问题描述】:

所以我有以下要求:我需要在 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

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

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

【问题讨论】:

    标签: django python-3.x django-models django-views django-templates


    【解决方案1】:

    这个呢:

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

    【讨论】:

    • 谢谢!有用。但我还有一个问题。我知道 django 表单应该将注册表保存在数据库中,但是,当我单击提交时,我在任何地方都看不到它,你知道会发生什么吗?
    • 对不起,我没有得到你的问题,请打开一个新的,以便更好地解释
    • 让我解释一下:我认为通过制作这个表格我会在数据库中保存一条新记录(数据库中的新 PM 对象),但是,我似乎没有随处可见。我是否必须实现一个新方法或类才能做到这一点?如果是这样,你能告诉我怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多